Linux

sed 用一個空格替換所有製表符和空格

  • July 23, 2020

我得到如下字元串:

test.de.          1547    IN      SOA     ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600

現在我想用一個空格替換記錄之間的所有製表符/空格,這樣我就可以輕鬆地使用它cut -d " "

我嘗試了以下方法:

sed "s/[\t[:space:]]+/[:space:]/g"

和各種變化,但無法讓它工作。有任何想法嗎?

採用sed -e "s/[[:space:]]\+/ /g"

這是一個解釋:

[   # 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).

對於您的替換,您只想插入一個空格。[:space:]在那裡不起作用,因為這是字元類的縮寫,並且正則表達式引擎不知道要放什麼字元。

+必須在正則表達式中轉義,因為 sed 的正則表達式引擎是+普通字元,而是\+“一個或多個”的元字元。在Mastering Regular Expressions的第 86 頁上,Jeffrey Friedl 在腳註中提到 ed 和 grep 使用轉義括號,因為“Ken Thompson 認為正則表達式將主要用於 C 程式碼,其中需要匹配原始括號比反向引用更常見。” 我假設他對加號也有同樣的感覺,因此需要將其轉義以將其用作元字元。很容易被這個絆倒。

在 sed 中,您需要轉義+, ?, |,(). 或使用 -r 使用擴展正則表達式(然後看起來像sed -r -e "s/[[:space:]]\+/ /g"sed -re "s/[[:space:]]\+/ /g"

引用自:https://serverfault.com/questions/431167