我发现这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 ver 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