使用 grep 匹配模式 '
我在 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}'
(
awk
的gsub()
替換並返回替換的數量)。