![当我在正则表达式中输入 \d 或 [0-9] 时,sed 就会失败](https://linux22.com/image/1529873/%E5%BD%93%E6%88%91%E5%9C%A8%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E4%B8%AD%E8%BE%93%E5%85%A5%20%5Cd%20%E6%88%96%20%5B0-9%5D%20%E6%97%B6%EF%BC%8Csed%20%E5%B0%B1%E4%BC%9A%E5%A4%B1%E8%B4%A5.png)
我正在尝试匹配“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 -e
sed
通常与和一样强大awk
,如果您更喜欢它的语法,您可能需要考虑使用它。根据您需要执行的操作,它可能比其对应项更混乱或更少混乱。