为什么sed中正则表达式中的`\d`无法生效?

92

我试图在sed中使用正则表达式\d,但它不起作用:

sed -re 's/\d+//g'

但这是有效的:

sed -re 's/[0-9]+//g'

1
@tchrist,我什么时候提到我使用Perl了? - user2036880
1
@tchrist 我想你的意思是 perl -pe 's/\d+//g',或者说这是我需要使用的形式来打印一个文件(所以在这种形式下使用:perl -pe 's/\d+//g' example.txt > example2.txt),你是在建议不同的用法吗? - Mike H-R
1
这个问题不应该被关闭。它侧重于为什么\d在sed中不表示数字。所引用的重复问题是关于“如何使用sed从字符串中提取文本”的。 - Robin A. Meade
2
@RobinA.Meade同意。投票关闭问题的人没有正确理解它。 - Manngo
3个回答

73

\d 不是一个正则表达式宏,而是一个开关。如果您想使用一些预定义的“常量”而不是 [0-9] 表达式,只需尝试运行此代码:

s/[[:digit:]]+//g

28
但是为什么\w有效呢? - user2036880
8
"\w 可以匹配任何“单词”字符。 “单词”字符可以是任何字母、数字或下划线字符。"还有另外一行很有意思:"此外,这个版本的sed支持几个转义字符(其中一些是多字符),用于在脚本中插入不可打印字符(\a、\c、\d、\o、\r、\t、\v、\x)。这可能会导致与其他sed编写的脚本类似的问题。” 更多内容请参考 http://www.gnu.org/software/sed/manual/sed.html - Kamil
1
@user2036880 如我在我的回答的第二部分所指出的,\d在sed中有不同的含义。 - Ivaylo Strandjev
已接受,+30,没有任何人漏掉了 \ 之前的 +。 - papo
在这个正则表 - Kamil

37

在 sed 中没有这样的特殊字符组。你需要使用 [0-9]

在 GNU sed 中,\d 表示一个介于 0-255 范围内的一至三位数的十进制字符代码。正如此评论所指出的那样。


-9

最好使用在sed中添加-E的扩展模式。 在基本的RegExp中,\d和其他一些字符无法被检测到 -E 将正则表达式解释为扩展(现代)正则表达式,而不是基本正则表达式(BRE)。 re_format(7)手册完全描述了这两种格式。


15
使用-E选项也无法检测\d - Daniel Kaplan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接