为啥 `\d` 在 sed 的正则表达式中不起作用? [复制]
Posted
技术标签:
【中文标题】为啥 `\\d` 在 sed 的正则表达式中不起作用? [复制]【英文标题】:Why doesn't `\d` work in regular expressions in sed? [duplicate]为什么 `\d` 在 sed 的正则表达式中不起作用? [复制] 【发布时间】:2013-01-18 05:46:42 【问题描述】:我正在尝试在 sed 的正则表达式中使用 \d
,但它不起作用:
sed -re 's/\d+//g'
但这是有效的:
sed -re 's/[0-9]+//g'
【问题讨论】:
@tchrist 我什么时候提到我使用 perl @tchrist 我想你的意思是perl -pe 's/\d+//g'
或者更确切地说这就是我需要用它来打印出一个文件(所以使用它的形式:perl -pe 's/\d+//g' example.txt > example2.txt
)你是不是建议一个不同的用法?
这个问题不应该被关闭。它的重点是为什么\d
不代表 sed 中的数字。引用为重复的问题是关于“如何使用 sed 从字符串中提取文本”。
【参考方案1】:
\d
是一个开关而不是一个正则表达式宏。如果您想使用一些预定义的“常量”而不是 [0-9]
表达式,请尝试运行以下代码:
s/[[:digit:]]+//g
【讨论】:
但是为什么\w
有效
正如它所写的是 sed 文档“\w 匹配任何“单词”字符。“单词”字符是任何字母或数字或下划线字符。”还有另外一句有趣的“另外,这个版本的 sed 支持几个转义字符(其中一些是多字符)在脚本中插入不可打印的字符(\a、\c、\d、\o、\r、 \t, \v, \x)。这些可能会导致为其他 sed 编写的脚本出现类似的问题。”更多请查看gnu.org/software/sed/manual/sed.html
@user2036880 正如我在答案的第二部分中指出的那样 \d
在 sed 中具有不同的含义。
已接受,+30,+ 前没有人丢失\
在此正则表达式中量化之前不需要反斜杠。【参考方案2】:
您最好通过添加-E
在 sed 中使用扩展模式。
在基本的 RegExp 中,\d 和其他一些不会被检测到
-E Interpret regular expressions as extended (modern) regular expressions rather than basic regular expressions (BRE's). The re_format(7) manual page fully describes both formats.
【讨论】:
\d
也不会被 -E 检测到。【参考方案3】:
sed 中没有这样的特殊字符组。您必须使用[0-9]
。
在 GNU sed 中,\d
引入了 0-255 范围内的一到三位数字的十进制字符代码。
如in this comment所示。
【讨论】:
以上是关于为啥 `\d` 在 sed 的正则表达式中不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章