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

时间:2012-07-29 04:22:33

标签: regex bash

我想要检查的一些大型ASCII图像是对称的。说我有以下文件:

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

第一行是我想要的,它们都是分开的,并且每个部分都有相同的数量(不过每次都不需要3个),接下来的两个不是我想要的。我想连续计算*的数量,然后确保有相同数量的^和M跟随它们。我试图在每一行上得到一些对称性,所以这样会很好:

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

如何扫描文件并查看问题行? 我尝试了几个带cat ASCIIfile | sed 's/\^//g' | sed 's/M//g' | wc -c的循环,并将输出分配给变量,然后将计数与其他字符数进行比较,但显然这没有考虑顺序,*^*^*M^MM之类的行正在运行。< / p>

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

Pure Bash:

#!/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,并在同一行的最后< filename之后添加done