我想知道最好的方法是什么(可能使用grep或者确认) 返回包含以下内容的行不平衡的特殊字符集在一个字符串中?例如,如果字符串是:
bqM#+t1U"OyBGhk]ozVG[v"&
并且指定的字符是双引号(“),则不会返回此行。但是,我要查找的内容更复杂,需要左右平衡,例如左方括号([)和右方括号 (]) 如果 ([) 的数量不等于 (]) 的数量,则返回该行,例如:
i],U2y.2<i*gZCl>y[A~a`^[
答案1
通过grep
支持类似 perl 正则表达式的实现-P
,您可以使用它们的递归正则表达式功能来查找具有匹配[
/]
对的行,并用于-v
反转:
grep -Pxv '((\[(?1)\]|[^][])*+)'
要求[
是已关注相应的]
ie[foo]
被认为是平衡的,但不是]foo[
或者如果顺序不重要:
grep -Pxv '((\[(?1)\]|\](?1)\[|[^][])*+)'
[foo]
又]foo[
平衡了,[foo
还是不行。
这实际上返回了[
s 数量与]
s 数量不同的行。实现这一目标的一种更简单的方法就是对它们进行计数。
perl -lne '$l = () = /\[/g; $r = () = /\]/g; print if $l != $r'
awk 'gsub(/\[/, "&") != gsub(/\]/, "&")'
使用sed
,您可以消除循环中的对,并打印是否还有剩余[
s 或]
s:
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'