删除某些行所需的REGEX帮助

时间:2015-01-12 01:32:20

标签: regex sed

我理解为什么

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输出,因为数据与模式匹配?

3 个答案:

答案 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"