找到缺少括号的行

时间:2012-03-20 08:52:01

标签: bash

我有一个带括号的文件:

{ This is } some text. { This } is some other text.

括号总是成对出现,偶尔会嵌套,但绝不会出现在多行中,例如:

{ This is } some text. { This
is some other text. }

我想搜索一些缺少括号的错误。如何找到缺少匹配括号的任何行?

5 个答案:

答案 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/:/'