GNU/Linux >> Znalost Linux >  >> Linux

sed nahradit všechny tabulátory a mezery jednou mezerou

Ř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.


Linux
  1. Smazání všech C komentářů se Sedem?

  2. Nahradit řádek jiným obsahem pomocí Sed And Parallel pro velký soubor?

  3. Nahradit rozsah řádků rozsahem řádků (sed nebo jiné)?

  1. Nahradit všechny nové řádky mezerníkem kromě posledního?

  2. Použití grep a sed k nalezení a nahrazení řetězce

  3. Najít a nahradit ve skriptování shellu

  1. Nahraďte chytré uvozovky příkazem sed pro Linux

  2. Jak rekurzivně nahradit znaky sed?

  3. AWK a názvy souborů s mezerou.