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

Bash 如何在搜索字符串中使grep匹配\1\2 e.t.c,bash,search,grep,escaping,backreference,Bash,Search,Grep,Escaping,Backreference,我尝试使用以下代码进行grep搜索\2 但是grep在测试文件中找不到匹配的字符串。我在运行cygwin C:\test 19# val="C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise" C:\test 20# escval="$(echo "$value" | sed -r 's,\\,\\\\,g')" C:\test 20# echo $escva

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

C:\test 19# val="C:\Program Files (x86)\Microsoft Visual Studio\2019\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 Studio\2019\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>.
C:\test 19\val=“C:\Program Files(x86)\Microsoft Visual Studio\2019\Enterprise”
C:\test 20#escval=“$(echo“$value”| sed-r's,\\,\\\,g')”
C:\test 20#echo$escval
C:\\ProgramFiles(x86)\\Microsoft Visual Studio\\2019\\Enterprise
C:\test 21#echo“export DIR=\”${val}\”>testdata
C:\test 22#cat测试数据
export DIR=“C:\Program Files(x86)\Microsoft Visual Studio\2019\Enterprise”
C:\test 23#cat testdata | grep-E“^[:space:]*导出[[:space:]+${key}=\“${val}\”;回声$?
grep:返回引用无效
2.
C:\test 24#cat testdata | grep-E“^[:space:]*导出[[:space:]+${key}=\“${escval}\”;回声$?
1.
C:\test25#grep-V
grep(GNU grep)3.0
由Cygwin包装(3.0-2)
版权所有(C)2017免费软件基金会。
许可证GPLv3+:GNU GPL版本3或更高版本。
这是自由软件:您可以自由更改和重新发布它。
在法律允许的范围内,不存在任何担保。
由Mike Haertel和其他人撰写,请参见。
尝试使用固定字符串不是一个选项,因为实际表达式

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

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

$ escval="$(echo "$val" | sed -E 's,([^[:alnum:]]),\\\1,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 Studio\2019\Enterprise"
0

注意:我使用
\s
而不是
[[:space:]
上的字符类匹配。它比较短,而且我觉得更容易阅读。

为什么要用
grep-E
作为字符串
-E
不表示“表达式”,它表示“扩展正则表达式”
-e
意思是“表达式”有或没有e我有相同的结果…我使用它是因为实际的代码也有一些正则表达式..我只是简化了步骤。我看到了teds的答案并修改了grep-F(固定字符串)不起作用,因为-E和-F是互斥的…至于转义它,如果我使用-E选项…没有-E它确实起作用。我只是从实际更新了测试数据…添加了导出E.t.cYes我需要整行。固定字符串选项虽然有吸引力,但不能使用,因为在我的例子中是复杂的reg表达式和-E和-F,并且相互关联独家。至于逃避,我试着在我的实际例子中遵循,我已经修改了一点,使问题更接近实际。根据建议。。。以下工作cat testdata | grep-E“^[:space:][]*导出[[:space:][]+${key}=“|grep\”${escval}\”;回声$?