查找具有奇数个括号的行

时间:2012-02-03 04:36:28

标签: bash grep curly-braces

我的文档中包含{},但我发现存在错误。我使用grep -c { *grep -c } *来查找{}的数量不相等。我想找到那些可能有错误的行,所以我可以手动检查它们。

  • 结束括号应始终显示在同一行,因此我需要找到{没有结束}的行或带有}的行而没有左括号
  • 有些线条有很多支撑,例如{ } { } { }
  • 永远不应该有嵌套大括号,例如“{{{}}}'。

如何搜索没有正确数量大括号的行?

4 个答案:

答案 0 :(得分:3)

您可以执行以下操作(这将打印行和行号) -

gawk -v FS="" '
{cnt=0;for(i=1;i<=NF;i++) if ($i=="{") ++cnt ;
else if ($i=="}") --cnt; if (cnt!=0) print NR":"$0}' file

测试:

[jaypal:~/Temp] cat file
this is {random text} some with { some without
purpose is{ to identify such lines} where { dont have a matching }
and print those lines with just one {

[jaypal:~/Temp] gawk -v FS="" '
> {cnt=0;for(i=1;i<=NF;i++) if ($i=="{") ++cnt ;
> else if ($i=="}") --cnt; if (cnt!=0) print NR":"$0}' file
1:this is {random text} some with { some without
3:and print those lines with just one {

答案 1 :(得分:2)

这可能对您有用:

sed 'h;y/}/{/;s/[^{]*{[^{]*{[^{]*//g;/./!d;g file

答案 2 :(得分:1)

试试这段代码。它将打印括号计数不匹配的那些行

#!/bin/bash
LINE_COUNT=1
cat decrypt.txt | while read line
do
    i=0
    O_B=0
    C_B=0
    while (( i++ < ${#line} ))
    do
       char=$(expr substr "$line" $i 1)
       #echo $char
       if [ "$char" = "{" ]
       then
        O_B=`expr $O_B + 1`
       elif [ "$char" = "}" ]
       then
        C_B=`expr $C_B + 1`
       fi
    done
    #echo "$line|$O_B|$C_B"
    if [ $O_B -ne $C_B ]
    then
        echo "$LINE_COUNT|$line|$O_B|$C_B"
    fi
    LINE_COUNT=`expr $LINE_COUNT + 1`
done

答案 3 :(得分:1)

我不是在我的电脑上试试,但我认为这可能有用

grep -v '^\([^{}]*{[^{}]*}[^{}]*\)*$'

如果我写得正确,那么这应该匹配(因此不能打印,因为-v)只有整行由成对组成的行,以便

  1. 第一个支撑是一个开口支撑,
  2. 下一个大括号存在,是一个右大括号,
  3. 重复零次或多次。