最良のアプローチが何であるかを知りたいです。grepまたは確認する) は、以下を含む行を返します。不均衡特殊文字セット文字列として?たとえば、文字列が次のような場合:
bqM#+t1U"OyBGhk]ozVG[v"&
そして、指定された文字が二重引用符( ")の場合、この行は返されません。 [)個数が(])個数と等しくない場合、行が返されます。
i],U2y.2<i*gZCl>y[A~a`^[
答え1
grep
Perlと同様の正規表現実装をサポートすることで、再帰正規表現機能を使用して一致/ペアのある行-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'