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").
两个选项是:
- 与
-E
、grep
使用扩展正则表达式,其中{}
自动为范围运算符。
- 没有
-E
,您需要使用反斜杠将 {}
标记为范围运算符而不是文字字符。 \{1,\}
是正则表达式语法。由于您在 shell double-quoted 字符串中,因此您需要转义反斜杠,因此 \{1,\}
.
要测试 shell 引用,一个简单的方法是使用 echo
。例如,在 bash:
$ echo grep -o "\"uri\":\"[^\"]\{1,\}\"" file.txt
grep -o "uri":"[^"]\{1,\}" file.txt
这表明,例如,模式中的 \
已折叠为单个 \
。
我有以下 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").
两个选项是:
- 与
-E
、grep
使用扩展正则表达式,其中{}
自动为范围运算符。 - 没有
-E
,您需要使用反斜杠将{}
标记为范围运算符而不是文字字符。\{1,\}
是正则表达式语法。由于您在 shell double-quoted 字符串中,因此您需要转义反斜杠,因此\{1,\}
.
要测试 shell 引用,一个简单的方法是使用 echo
。例如,在 bash:
$ echo grep -o "\"uri\":\"[^\"]\{1,\}\"" file.txt
grep -o "uri":"[^"]\{1,\}" file.txt
这表明,例如,模式中的 \
已折叠为单个 \
。