我的 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}'
(awk
的gsub()
替换并返回替换的数量)。