Grep

使用 grep 匹配模式 '

  • September 10, 2015

我在 json 中有一個 json 字元串。這被多次編碼,我最終得到了許多逃避反彈:\\\".

大大縮短的字元串看起來像,

'[{"testId" : "12345", "message": "\\\"the status is pass\\\" comment \\\\\"this is some weird encoding\\\\\""}]'

我正在嘗試 grep 並獲取模式的出現次數\\\"而不是\\\\\"

我該怎麼做?

任何 shell/python 解決方案都很好。在python中,使用搜尋字元串

search_string = r"""\\\\\""",拋出unexpected EOF錯誤。

要查找\\\"一行中的任何位置:

grep -F '\\\"'

也就是說,-F用於固定字元串搜尋,而不是正則表達式匹配(反斜杠是特殊的)。並使用強引號 ( '...'),其中反斜杠並不特殊。

如果沒有-F,您需要將反斜杠加倍:

grep '\\\\\\"'

或使用:

grep '\\\{3\}"'
grep -E '\\{3}"'
grep -E '[\]{3}"'

在雙引號內,您需要另一個級別的反斜杠,並且還需要"使用反斜杠轉義:

#              1
#     1234567890123
grep "\\\\\\\\\\\\\""

反斜杠是另一個 shell 引用運算符。所以你也可以用反斜杠引用那些反斜杠和"字元:

\g\r\e\p \\\\\\\\\\\\\"

我什至引用了grep上面的字元,儘管這不是必需的(因為沒有g, r, e,對 shell 來說p是特殊的(如果它們出現在 Bourne shell 中除外$IFS)。我沒有引用的唯一字元是空格字元,因為我們確實需要它在 shell 中的特殊含義:單獨的參數。

要查找,\\\"前提是它前面沒有另一個反斜杠

grep -e '^\\\\\\"' -e '[^\]\\\\\\"'

也就是說,在行首查找\\\",或者在反斜杠以外的字元之後查找。

那個時候,我們必須使用正則表達式,固定字元串搜尋是不行的。

grep返回匹配任何這些表達式的行。您也可以每行使用一個表達式來編寫它:

grep '^\\\\\\"
[^\]\\\\\\"'

或者只有一個表達式:

grep '^\(.*[^\]\)\{0,1\}\\\{3\}"' # BRE
grep -E '^(.*[^\])?\\{3}"'        # ERE equivalent
grep -E '(^|[^\])\\{3}"'

使用帶有 PCRE 支持的 GNU grep,您可以使用後向否定斷言:

grep -P '(?<!\\)\\{3}"'

獲取匹配計數

要獲取與模式匹配的數(即出現一次或多次\\\"),您需要將-c選項添加到grep. 但是,如果您想要出現次數,您可以使用 GNU 特定-o選項(儘管現在也受到其他一些實現的支持)每行列印所有匹配項,然後通過管道wc -l獲取行數:

grep -Po '(?<!\\)\\{3}"' | wc -l

或標準/POSIXly,awk改為使用:

awk '{n+=gsub(/(^|[^\\])\\{3}"/,"")};END{print 0+n}'

(awkgsub()替換並返回替換的數量)。

引用自:https://unix.stackexchange.com/questions/228786