当我在正则表达式中输入 \d 或 [0-9] 时,sed 就会失败

当我在正则表达式中输入 \d 或 [0-9] 时,sed 就会失败

我正在尝试匹配“64”:

state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,

并将其提取。

我试过了

echo "$line" | sed -n -e 's/^.*keycode\s\([0-9]+\).*$/\1/p'

我认为这应该可行,但事实并非如此。

经过更多测试后,正则表达式匹配成功,直到我开始引入数字。

echo "$line" | sed -n -e 's/^.*keycode\s.*/test/p'

工作正常,但是

echo "$line" | sed -n -e 's/^.*keycode\s\d.*/test/p'
echo "$line" | sed -n -e 's/^.*keycode\s[0-9].*/test/p'

并且相关功能不起作用,即使空格后面有一个数字。

我是否遗漏了一些显而易见的东西?

答案1

您的表达式中只有一个小错误sed:加号+字符需要转义。

echo "state 0x0, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES," | sed -n -e 's/^.*keycode\s\([0-9]\+\).*$/\1/p'

输出64符合预期。我们过去常常聚合酶链反应sed语法在使用其他工具(如或 )时应注意差异,awk每个工具都有一组特殊的特殊字符,其中一些需要转义,有些则不需要。

一个例子是\d,它代表 PCRE 中的任何数字,而在 中具有不同的含义sed,正如 Cyrus 在他的评论中指出的那样:应该使用[0-9]或来代替。[[:digit:]]

perl -esed通常与和一样强大awk,如果您更喜欢它的语法,您可能需要考虑使用它。根据您需要执行的操作,它可能比其对应项更混乱或更少混乱。

介绍性的 文章尝试perl -e聚合酶链反应或者读一篇有用的sed或者awk教程。

相关内容