我正在尝试匹配“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
,如果您更喜欢它的语法,您可能需要考虑使用它。根据您需要执行的操作,它可能比其对应项更混乱或更少混乱。