我發現sed
通常無法對空白進行模式匹配。考慮以下範例:
echo 'A B C' | sed 's/[ \t]*//g'
ABC
echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A B C
perl -e 'print "A B C\n"' | sed 's/[ \t]*//g'
ABC
perl -e 'print "A\tB\tC\n"' | sed 's/[ \t]*//g'
A B C
有人可以解釋為什麼sed
有時無法匹配空格嗎?
答案1
1.
echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
A B C
對我有用
$ echo -e 'A\tB\tC' | sed 's/[ \t]*//g'
ABC
嘗試這個
$ echo -e 'a\tb' | sed -e 's/[ \t]//'
ab
2.
perl -e 'print "A B C\n"' | sed 's/^[ \t]*//g'
A B C
^
您的字串在該行的開頭 ( ) 不包含空格
答案2
某些版本sed
不支援\t
替換命令左側的轉義以及其他一些轉義。
sed
您可以在以下位置找到有關各版本之間差異的信息常問問題。
答案3
上面的第二個語句適用於我的機器(Ubuntu 10.10 amd64、sed 版本 4.2.1、sed 軟體包版本 4.2.1-7),我並沒有真正解釋為什麼該語句不起作用。
第三個和第四個是因為您使用的是行首錨點 (^),所以它會僅有的刪除前導空格,並且在輸入文字中,行開頭沒有任何空格。
答案4
你應該使用\s匹配空格和製表符:
echo 'A B C' | sed 's/\s//g'
ABC
echo -e 'A\tB\tC' | sed 's/\s//g'
ABC
perl -e 'print "A B C\n"' | sed 's/\s//g'
ABC
perl -e 'print "A\tB\tC\n"' | sed 's/\s//g'
ABC