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

问题描述

我尝试了以下代码以使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>.

尝试使用固定字符串是不可行的,因为实际上是表达式。

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

解决方法

您需要转义所有 反斜杠,不仅是数字(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:]]上匹配的字符类。它更短,我觉得更容易阅读。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...