如何在搜索字符串中使 grep 匹配 \1 \2 e.t.c

How to make grep match \1 \2 e.t.c in search string

我尝试使用以下代码让 grep 搜索 \2 但是 grep 无法在测试文件中找到匹配的字符串。我是 运行 cygwin.

C:\test 19# val="C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise"

C:\test 20# escval="$(echo "$value" | sed -r 's,\,\\,g')"

C:\test 20# echo $escval
C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise

C:\test 21# echo "export DIR=\"${val}\"" > testdata

C:\test 22# cat testdata
export DIR="C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise"

C:\test 23# cat testdata | grep -E  "^[[:space:]]*export[[:space:]]+${key}=\"${val}\""; echo $?
grep: Invalid back reference
2

C:\test 24# cat testdata |  grep -E "^[[:space:]]*export[[:space:]]+${key}=\"${escval}\""; echo $?
1

C:\test 25# grep -V
grep (GNU grep) 3.0
Packaged by Cygwin (3.0-2)
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

尝试使用固定字符串不是一个选项,因为实际的表达式..

更新:我也尝试了所有转义并且我修改了我的问题。

您需要转义 所有 反斜杠,不仅是数字前的反斜杠 (2) 以及确实需要扩展正则表达式的更新问题,你也需要转义 ()。事实上,除了字母数字字符之外的所有字符都要转义:

$ escval="$(echo "$val" | sed -E 's,([^[:alnum:]]),\,g')"
$ echo "${escval}"
C\:\Program\ Files\ \(x86\)\Microsoft\ Visual\ Studio\2019\Enterprise
$ grep -E "^\s*export\s+${key}=\"${escval}\"" testdata ; echo $?
export DIR="C:\Program Files (x86)\Microsoft Visual Studio19\Enterprise"
0

注意:我使用 \s 而不是匹配 [[:space:]] 的字符 class。它更短,我发现它更容易阅读。