为什么 echo "a']" | grep -E "\'" 不匹配?

Ken*_*Y-N 2 grep regular-expression

基于这个关于 SO 的问题,我发现:

echo "a']" | grep -E "\a"
Run Code Online (Sandbox Code Playgroud)

匹配正常。

echo "a']" | grep -E "\]"
Run Code Online (Sandbox Code Playgroud)

匹配正常。

但:

echo "a']" | grep -E "\'"
Run Code Online (Sandbox Code Playgroud)

不匹配。我找不到任何文档来描述如何准确grep -E处理转义单引号。我在 Ubuntu 14.04 上使用 GNU grep 2.16。

注意:

echo "a']" | grep -E "'"
Run Code Online (Sandbox Code Playgroud)

匹配 OK,但我很好奇如何grep -E解释\'.

更新:

我刚刚在 Cygwin 2.6.1 和 grep 2.27 上尝试过这个,我可以重现。使用grep --colour -Eo也许会给出更清晰的 OK/Fail 结果?

Ed *_*ton 7

不仅仅是 GNU grep,还有 GNU sed 和 GNU awk:echo "a']" | sed "s/\'/foo/"->a']fooecho "a']" | awk "{sub(/\'/,\"foo\")}1"-> a']foo。当您在 POSIX 模式下运行 awk 时,它不会这样做,而是表现出预期的行为:echo "a']" | awk --posix "{sub(/\'/,\"foo\")}1"-> afoo]

问题是有一个 GNU-ism 的\'意思与 相同$,请参阅http://www.regular-expressions.info/gnu.html

Additional GNU Extensions
....
The anchor \` (backtick) matches at the very start of the subject string,
while \' (single quote) matches at the very end. 
Run Code Online (Sandbox Code Playgroud)

如果有人有\'$我不同的用例,我很乐意听到。

  • 是的,他们是 _GNU_ 运营商,更具体地说是 [_buffer 运营商_](https://www.gnu.org/software/gnulib/manual/html_node/Buffer-Operators.html) (2认同)