为啥 `\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 的正则表达式中不起作用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式在 Sed 中不起作用

为啥加号运算符在 JavaScript 的正则表达式中不起作用? [复制]

为啥非贪心量词有时在 Oracle 正则表达式中不起作用?

为啥正则表达式不起作用

在 sed 中使用反向引用正则表达式

与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用