删除某些行需要 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"
我明白为什么
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"