繁体   English   中英

在regex中使用“在Linux中使用grep命令

[英]grep command in linux using " in regex

我有以下linux cmd:

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

原始海报提供的正则表达式几乎是正确的,但存在一些缺陷,以下是他/她的版本和更正的正则表达式:

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

首次使用grep的问题是:

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

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

要么

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

会省略尾随无关字符。

说明:

  • 您的grep命令在模式之前列出了file.txt ,但是grep首先需要模式,然后是文件。
  • 代替. ,则需要[^\\"]来匹配引号之间的字符。这是因为.会匹配"本身”,因此.{1,}通过中间的双引号进行匹配(“贪婪匹配”)。

这两个选项是:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM