簡體   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