2

チェックしたい大きなASCII画像が対称になっています。次のファイルがあるとします。

 ***^^^MMM
 *^**^^MMM
 **^^^^^MMMMM

最初の行は私が欲しいものです、それらはすべて分離されており、各セクションで同じ量です(ただし、毎回3である必要はありません)、次の2つは私が望むものではありません。連続する*の数を数え、それに続く^とMの数が同じであることを確認したいと思います。私は各線で対称性を得ようとしているので、これは良いことです:

**^^MM
**********^^^^^^^^^^MMMMMMMMMM
****^^^^MMMM
*^M
etc.

ファイルをスキャンして問題の行をgrepするにはどうすればよいですか?変数を使用して出力を割り当て、カウントを他の文字カウントと比較していくつかのループを試しましたcat ASCIIfile | sed 's/\^//g' | sed 's/M//g' | wc -cが、明らかにこれは順序や行が機能していたことを考慮していません*^*^*M^MM

4

2 に答える 2

2

perlの使用:

perl -ne ' { $l=$_; chomp; ($v)=/^((.)\2*)/; $t=length($v); \
     s/M{$t}//;s/\^{$t}//;s/\*{$t}//; \
     print $l if length } ' input_file

bash / sedの使用:

while read line; do
  m=$(echo $line | sed 's/[^M]*\([M][M]*\)[^M]*/\1/' | wc -c)
  s=$(echo $line | sed 's/[^*]*\([*][*]*\)[^*]*/\1/' | wc -c)
  n=$(echo $line | sed 's/[^\^]*\([\^][\^]*\)[^\^]*/\1/' | wc -c)
  if [[ $m -ne $s || $m -ne $n ]]; then
    echo "- $line    $m::$s::$n"
  else
    echo "+ $line    $m::$s::$n"
  fi  
done < input_file
于 2012-07-29T05:48:35.883 に答える
1

ピュアバッシュ:

#!/bin/bash
for string in '***^^^MMM' '**^^MM' '****^^MMMM' '*^*M^'
do
    flag=true
    sym=true
    patt=''
    prevlen=${#string}
    for c in '*' '^' 'M'
    do
        patt+="*\\$c"
        sub="${string##$patt}"
        sublen="${#sub}"
        if $flag
        then
            flag=false
            ((compare = prevlen - sublen ))
        else
            if (( prevlen - sublen != compare ))
            then
                printf '%s\n' "$string is NOT symmetrical"
                sym=false
                break
            fi
        fi
        prevlen=$sublen
    done
    if $sym
    then
        printf '%s\n' "$string IS symmetrical"
    fi
done

ファイルから読み取るには、最初のforループをに変更し、同じ行の最後のループの後にwhile read -r string追加します。< filenamedone

于 2012-07-29T15:03:51.790 に答える