我有一些大的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
。