我想要检查的一些大型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>
答案 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
。