删除某些行需要 REGEX 帮助

REGEX help needed for deleting certain lines

我明白为什么

echo abc 123 xyz|sed "/abc\s*\d*\s*$/d"

生产

abc 123 xyz

因为模式是 abc 后跟 0 个或多个白色 space 后跟 0 个或多个数字后跟 0 个或多个白色 space 后跟行尾并且数据不匹配该规范是因为 xyz 字符。

为什么

echo abc 123  |sed "/abc\s*\d*\s*$/d"

生产

abc 123

而不是空输出,因为数据与模式匹配?

因为\d不是sed支持的字符class:

$ 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:].

字符 class 受 sed 正则表达式支持

POSIX sed 有文档说明 here. POSIX requires sed to support Basic Regular Expressions (BREs). The POSIX spec for BREs is here 并指定,包括 [:digit:], sed 正则表达式必须支持以下字符 class所有语言环境中的 es:

[:alnum:]   [:cntrl:]   [:lower:]   [:space:]
[:alpha:]   [:digit:]   [:print:]   [:upper:]
[:blank:]   [:graph:]   [:punct:]   [:xdigit:]

GNU's sed 提供了几个扩展。这包括 "word" 字符的 \w,意思是字母数字和下划线,以及在单词边界匹配的 \b。正如 Bill Gradwohl 所观察到的,\s,表示白色 space,在 GNU sed 下工作,但在文档中没有

sed 程序对某些正则表达式结构的支持有限,特别是 \d。您可以通过使用 [0-9] 之类的东西来解决这个问题。

或者,由于查找或删除行更多是 grep 的权限,您可以使用 it 为您完成这项工作。假设你有 GNU grep,它可以很好地执行 Perl 正则表达式:

echo abc 123  | grep -Pv "abc\s*\d*\s*$"

如果您必须使用sed,因为例如,您需要在每一行上执行许多复杂的命令,请随时忽略它建议。否则,我的建议是选择更适合工作的工具。

\d

的解决方法
echo abc 123  |sed "/abc\s*[0-9]*\s*$/d"