Linux
sed 用一個空格替換所有製表符和空格
我得到如下字元串:
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"