我有一个带括号的文件:
{ This is } some text. { This } is some other text.
括号总是成对出现,偶尔会嵌套,但绝不会出现在多行中,例如:
{ This is } some text. { This
is some other text. }
我想搜索一些缺少括号的错误。如何找到缺少匹配括号的任何行?
答案 0 :(得分:2)
$ sed 's/{[^{}]*}//g' input.txt | grep -n '[{}]'
答案 1 :(得分:1)
使用perl
的一个解决方案:
perl -lne '
BEGIN {
our $bo, $bc;
}
m/(?: \{ (?{ ++$bo }) | \} (?{ ++$bc }) | . ) */x;
if ( $bo != $bc ) {
printf qq[%s (Line %d): %s\n], qq[Missing bracket], $., $_;
}
$bo = $bc = 0
' infile
变量$bo
表示左括号,$bc
表示结束括号。当其中一个变量找到时,正则表达式会增加变量,并在此之后比较其值。如果不同,请打印一行。
使用此输入文件( infile ):
{ This is } some text. { This } is some other text.
{ This is } some text. { This
is some other text. }
结果:
Missing bracket (Line 2): { This is } some text. { This
Missing bracket (Line 3): is some other text. }
答案 2 :(得分:1)
perl -pane '$rr = qr/{[^{}]*(??{$rr})*[^{}]*}/; s/$rr//g;' input.txt | grep -n '[{}]'
答案 3 :(得分:1)
使用awk
:
awk '(length(gensub("[^{]","","g"))-length(gensub("[^}]","","g"))) != 0 { print NR, $0}'
答案 4 :(得分:1)
这可能对您有用:
sed ':a;s/{[^{}]*}//g;ta;/[{}]/=;d' file
打印出不平衡线的行数。如果你也想要这条线:
sed 'h;:a;s/{[^{}]*}//g;ta;/[{}]/!d;=;g' | sed 'N;s/\n/:/'