linux 中的 grep 命令在正则表达式中使用 "

grep command in linux using " in regex

我有以下 linux 命令:

grep -o file.txt "\"uri\":\".{1,}\""

我的文字如下:

"some characters here","uri":"some_URI*Here.^%$#!", "again a set of irrelevant characters"

当然我想要的输出是:

"uri":"some_URI*Here.^%$#!"

为什么我没有正确的输出?因为在我的文本中混合了 " 的 grep 要求的 "?如何解决?

您可以使用以下正则表达式:

grep -oE '"uri":".[^"]+"' inputFile

原发帖者提供了一个几乎正确但有一些缺陷的正则表达式,下面是his/her版本和更正的版本:

grep -o  inputFile "\"uri\":".{1,}\""   # wrong
grep -oE '"uri":"[^"]{1,}"' inputFile   # correct

第一次使用grep遇到的问题是:

  • inputFile 应该在正则表达式之后,而不是在
  • 之前
  • 需要 -E 标志才能使 {1,} 工作
  • 最好在外面使用单引号,这样双引号就不用转义了
  • 需要使用 [^"] 个字符 class 而不是 .

或者

 grep -oE "\"uri\":\"[^\"]{1,}\"" file.txt

grep -o "\"uri\":\"[^\"]\{1,\}\"" file.txt

将忽略尾随的不相关字符。

解释:

  • 您的 grep 命令在模式之前列出 file.txt,但是 grep 需要先模式,然后是文件。
  • 而不是 .,您需要 [^\"] 来匹配引号之间的字符。那是因为 . 将匹配 " 本身,所以 .{1,} 匹配中间的双引号 ("greedy matching").

两个选项是:

  • -Egrep使用扩展正则表达式,其中{}自动为范围运算符。
  • 没有 -E,您需要使用反斜杠将 {} 标记为范围运算符而不是文字字符。 \{1,\} 是正则表达式语法。由于您在 shell double-quoted 字符串中,因此您需要转义反斜杠,因此 \{1,\}.

要测试 shell 引用,一个简单的方法是使用 echo。例如,在 bash:

$ echo grep -o "\"uri\":\"[^\"]\{1,\}\"" file.txt
grep -o "uri":"[^"]\{1,\}" file.txt

这表明,例如,模式中的 \ 已折叠为单个 \