文字列内の不均衡特殊文字を検出する方法

文字列内の不均衡特殊文字を検出する方法

最良のアプローチが何であるかを知りたいです。grepまたは確認する) は、以下を含む行を返します。不均衡特殊文字セット文字列として?たとえば、文字列が次のような場合:

bqM#+t1U"OyBGhk]ozVG[v"&

そして、指定された文字が二重引用符( ")の場合、この行は返されません。 [)個数が(])個数と等しくない場合、行が返されます。

i],U2y.2<i*gZCl>y[A~a`^[

答え1

grepPerlと同様の正規表現実装をサポートすることで、再帰正規表現機能を使用して一致/ペアのある行-Pを見つけて反転できます。[]-v

grep -Pxv '((\[(?1)\]|[^][])*+)'

要件[すでにフォロー中]つまり、バランス[foo]の取れたと見なされますが、そうではありません。]foo[

または順序が重要でない場合:

grep -Pxv '((\[(?1)\]|\](?1)\[|[^][])*+)'

[foo]再び]foo[バランスを取ったが、[fooそれでも動作しません。

これは実際にs個とは異なる[s個の行を返します。]これを達成するより簡単な方法は、数を数えることです。

perl -lne '$l = () = /\[/g; $r = () = /\]/g; print if $l != $r'
awk 'gsub(/\[/, "&") != gsub(/\]/, "&")'

を使用すると、ループからペアを削除し、sまたはsが残っているかsedどうかを印刷できます。[]

sed -e 'h;:1' -e 's/\[\(.*\)\]/\1/g;s/\]\(.*\)\[/\1/g;t1' -e '/[][]/!d;g'

または順序が重要な場合:

sed -e 'h;:1' -e 's/\[\([^][]*\)\]/\1/g;t1' -e '/[][]/!d;g'

関連情報