如何使用bash检查ASCII图像的平衡



我有一些大的ASCII图像,我想检查它们是否对称。假设我有以下文件:

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

第一行是我想要的,它们都是分开的,每个部分的数量都相同(但不必每次都是3),接下来的两行不是我想要的。我想计算一行中*的数量,然后确保后面有相同数量的^和M。我试图在每条线上获得一些对称性,所以这将是很好的:

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

我怎样才能扫描文件,并可能grep问题行?我尝试了几个使用cat ASCIIfile | sed 's/^//g' | sed 's/M//g' | wc -c的循环,将输出分配给一个变量,然后将计数与其他字符计数进行比较,但很明显,这没有考虑顺序,像*^*^*M^MM这样的行正在工作。

使用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

纯重击:

#!/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 '%sn' "$string is NOT symmetrical"
                sym=false
                break
            fi
        fi
        prevlen=$sublen
    done
    if $sym
    then
        printf '%sn' "$string IS symmetrical"
    fi
done

要读取文件,请将第一个for循环更改为while read -r string,并在同一行的最后一个done之后添加< filename

最新更新