使用 grep 匹配模式 \\\"

使用 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错误。

答案1

要查找\\\"线上的任意位置:

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,都不p是 shell 所特有的(除非它们出现在 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()替换并返回替换的数量)。

相关内容