2

我有一些要检查的大型 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

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 回答