bash - 如何在搜索字符串中使 grep 匹配 \1 \2 等
问题描述
我尝试使用以下代码使 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:]]
。它更短,我发现它更容易阅读。
推荐阅读
- blazor - Blazor eventcallback 仅在设置 eventcallback 时执行一次
- java - 在方法 CompareTo(E) 中找不到符号
- javascript - 在JS中制作一个打开/关闭背景音乐的按钮
- javascript - 我如何在反应中增加和查看购物车项目?
- r - 基于现有列创建多个新列
- python - 我有 25 年的月平均数据,我想取多年来每个月的平均值,我的 for 循环是否正确?
- flutter - Flutter:NoSuchMethodError:方法'connect'在null上被调用
- javascript - ID 有时不会随 onclick 事件返回?
- php - 为什么 opcache 没有被刷新?
- c# - WPF C# Cefsharp 版本。71,我有一个 URL 和一个 cookie,它将绕过登录并显示最终结果,直到显示加载