Řešení 1:
Použijte sed -e "s/[[:space:]]\+/ /g"
Zde je vysvětlení:
[ # start of character class
[:space:] # The POSIX character class for whitespace characters. It's
# functionally identical to [ \t\r\n\v\f] which matches a space,
# tab, carriage return, newline, vertical tab, or form feed. See
# https://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes
] # end of character class
\+ # one or more of the previous item (anything matched in the brackets).
Pro vaši náhradu chcete vložit pouze mezeru. [:space:]
nebude tam fungovat, protože to je zkratka pro třídu znaků a regex engine by nevěděl, jaký znak tam dát.
+
musí být escapováno v regulárním výrazu, protože se sedovým regulárním výrazem +
je normální znak, zatímco \+
je metaznak pro „jeden nebo více“. Na straně 86 v části Ovládání regulárních výrazů , Jeffrey Friedl v poznámce pod čarou zmiňuje, že ed a grep používali uvozené závorky, protože "Ken Thompson cítil, že regulární výrazy by se používaly především pro práci s Ccode, kde by potřeba sladit nezpracované závorky byla běžnější než zpětné odkazování." Předpokládám, že se cítil stejně se znaménkem plus, a proto bylo potřeba z něj uniknout a použít ho jako metaznak. Je snadné se o to nechat zakopnout.
V sed budete muset escapovat +
, ?
, |
, (
a )
. nebo použijte -r pro použití rozšířeného regulárního výrazu (pak to vypadá jako sed -r -e "s/[[:space:]]\+/ /g"
nebo sed -re "s/[[:space:]]\+/ /g"
Řešení 2:
Můžete použít -s
("squeeze") možnost tr
:
$ tr -s '[:blank:]' <<< 'test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600'
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600
[:blank:]
znaková třída obsahuje jak mezery, tak tabulátory.