私のjsonにjson文字列があります。これは何度もエンコードされ、最終的に多くの出口バウンスが発生しました\\\"
。
大幅に短縮された文字列は次のとおりです。
'[{"testId" : "12345", "message": "\\\"the status is pass\\\" comment \\\\\"this is some weird encoding\\\\\""}]'
grepを試してパターンの発生回数を取得しようとしていますが、そうでは\\\"
ありませんか\\\\\"
?
どうすればいいですか?
すべてのシェル/Pythonソリューションが機能します。 Pythonでは検索文字列を使用してください。
search_string = r"""\\\\\"""
、unexpected EOF
エラーが発生します。
ベストアンサー1
\\\"
行のどこにでも検索するには:
grep -F '\\\"'
つまり、-F
固定文字列検索の場合、正規表現一致(バックスラッシュが特殊な場合)ではありません。そして'...'
バックスラッシュが特別でない場合は、二重引用符()を使用してください。
そうでない場合は、-F
バックスラッシュを2倍にする必要があります。
grep '\\\\\\"'
または以下を使用してください。
grep '\\\{3\}"'
grep -E '\\{3}"'
grep -E '[\]{3}"'
二重引用符の中には別のバックスラッシュレイヤーが必要で、"
バックスラッシュエスケープを使用します。
# 1
# 1234567890123
grep "\\\\\\\\\\\\\""
バックスラッシュは別のシェル引用演算子です。だからあなたもできます。引用するバックスラッシュと"
バックスラッシュのある文字は次のとおりです。
\g\r\e\p \\\\\\\\\\\\\"
grep
必ずしも必要ではありませんが上記の文字を引用しました( 、 、もシェルに特定しないからですg
( Bourner
シェルe
にp
表示されない限り$IFS
))。私が引用しなかった唯一の文字は空白文字です。シェルでは特別な意味が必要です。別々のパラメータ。
\\\"
他のバックスラッシュが前に来ないことを確認するには
grep -e '^\\\\\\"' -e '[^\]\\\\\\"'
つまり、\\\"
行の先頭またはバックスラッシュではなく文字の後ろから検索します。
この時点で正規表現を使用する必要があり、固定文字列検索は機能しません。
grep
これらの式のいずれかに一致する行を返します。 1行に1つの式で書くこともできます。
grep '^\\\\\\"
[^\]\\\\\\"'
または、1つの表現のみを使用してください。
grep '^\(.*[^\]\)\{0,1\}\\\{3\}"' # BRE
grep -E '^(.*[^\])?\\{3}"' # ERE equivalent
grep -E '(^|[^\])\\{3}"'
PCREサポートで構築されたGNUを使用すると、grep
Lookbehind否定アサーションを使用できます。
grep -P '(?<!\\)\\{3}"'
一致する数を取得
カウントを取得するにはワイヤーパターンと一致する場合(つまり、1回以上発生\\\"
)-c
、オプションを追加できますgrep
。ただし、発生回数が必要な場合は、GNU固有の-o
オプション(現在は他の実装でもサポートされています)を使用して、すべての発生を1行に1つずつ印刷してから、行数をwc -l
パイプすることができます。
grep -Po '(?<!\\)\\{3}"' | wc -l
または標準/ POSIXlyでは、以下を使用しますawk
。
awk '{n+=gsub(/(^|[^\\])\\{3}"/,"")};END{print 0+n}'
(交換した数量をawk
交換して返します)。gsub()