【问题标题】:How to make grep match \1 \2 e.t.c in search string如何在搜索字符串中使 grep 匹配 \1 \2 e.t.c
【发布时间】:2020-09-28 19:30:13
【问题描述】:

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

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

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

【问题讨论】:

  • 你为什么使用grep -E作为字符串? -E 不是“表达式”,而是“扩展正则表达式”。 -e 表示“表达式”
  • 有或没有 E 我有相同的结果......我使用它是因为实际代码也有一些正则表达式......我只是简化了步骤。
  • 我看到了 teds 的回答并修改了 grep... -F(固定字符串)不起作用,因为 -E 和 -F 和排他性...至于转义它以某种方式不起作用,如果我使用 -E 选项...没有 -E 它确实有效。
  • 我刚刚从实际更新了测试数据...添加了 export e.t.c
  • 是的,我需要整行。

标签: bash search grep escaping backreference


【解决方案1】:

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

$ 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:]] 上的字符类匹配。它更短,我觉得更容易阅读。

【讨论】:

  • 固定字符串选项虽然很有吸引力,但不能使用,因为在我的情况下是复杂的 reg 表达式和 -E 和 -F 并且互斥。至于转义,我尝试在我的实际示例中进行以下操作
  • 我已将问题修改为更接近实际情况。
  • 基于建议...以下作品 cat testdata | grep -E "^[[:space:]]*export[[:space:]]+${key}=" | grep \"${escval}\" ;回声 $?
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 2015-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
相关资源
最近更新 更多