我理解为什么
echo abc 123 xyz|sed "/abc\s*\d*\s*$/d"
产生
abc 123 xyz
因为模式是abc,后跟0或更多的空格,后跟0或更多的数字,后跟0或更多的空格,后跟行尾,由于xyz字符,数据不符合该规范。
为什么
echo abc 123 |sed "/abc\s*\d*\s*$/d"
生产
abc 123
而不是null输出,因为数据与模式匹配?
答案 0 :(得分:2)
因为\d
不是sed
支持的字符类:
$ echo abc 123 |sed '/abc\s*\d*\s*$/d'
abc 123
改为使用[:digit:]
:
$ echo abc 123 |sed '/abc\s*[[:digit:]]*\s*$/d'
$
\d
可用作perl或python等语言的正则表达式扩展。 sed
支持的正则表达式语法更基本。有关GNU sed
支持的正则表达式语法的概述,请参阅here。
请注意,[:digit:]
适用于unicode字体,而[0-9]
则不适用。因此,所有新代码都应使用[:digit:]
。
sed
正则表达式 POSIX sed
已记录在案here。 POSIX要求sed
支持基本正则表达式(BRE)。 BRE的POSIX规范为here,并指定包括[:digit:]
,sed
正则表达式必须支持所有语言环境中的以下字符类:
[:alnum:] [:cntrl:] [:lower:] [:space:]
[:alpha:] [:digit:] [:print:] [:upper:]
[:blank:] [:graph:] [:punct:] [:xdigit:]
GNU's sed
提供了多种扩展功能。这包括\w
用于" word"字符,意思是字母数字和下划线,以及\b
在字边界处匹配。正如Bill Gradwohl所说,\s
表示空格,在GNU sed
下运行,但在文档中提到 。
答案 1 :(得分:1)
sed
程序对某些正则表达式结构的支持有限,特别是\d
。您可以使用类似[0-9]
的内容来解决此问题。
或者,由于查找或删除行更多是grep
的权限,您可以使用 it 为您完成工作。假设你有GNU grep
,它可以很好地完成Perl正则表达式:
echo abc 123 | grep -Pv "abc\\s*\\d*\\s*$"
如果 使用sed
因为,例如,您需要在每一行上执行许多复杂的命令,请随意忽略此建议。否则,我的建议是为工作选择更合适的工具。
答案 2 :(得分:1)
解决\d
echo abc 123 |sed "/abc\s*[0-9]*\s*$/d"