1

全体を含むドキュメントが{あり}ますが、間違いがあることがわかりました。とを使用grep -c { *して、とgrep -c } *の数が等しくないことを確認しました。エラーの可能性がある行を見つけたいので、手動で確認できます。{}

  • 中括弧は常に同じ行に表示される必要があるため、中括弧がない行または中括弧{がない行を見つける必要があります。}}
  • 一部の行には多くの中括弧があります{ } { } { }
  • `{{{}}}'のように、中括弧を入れ子にすることはできません。

中括弧の数が正しくない行を検索するにはどうすればよいですか?

4

4 に答える 4

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 {
于 2012-02-03T05:01:57.233 に答える
2

これはあなたのために働くかもしれません:

sed 'h;y/}/{/;s/[^{]*{[^{]*{[^{]*//g;/./!d;g file
于 2012-02-03T05:36:22.253 に答える
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
于 2012-02-03T04:59:10.743 に答える
1

私は自分のコンピューターに挑戦していませんが、これはうまくいくかもしれないと思います

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

私が正しく書いた場合、これは、-v行全体が次のようなペアで構成されている行のみに一致するはずです(したがって、印刷されないためです)。

  1. 最初のブレースはオープニングブレースであり、
  2. 次のブレースが存在し、それは閉じブレースです。

0回以上繰り返した。

于 2012-02-03T05:16:13.333 に答える