2012-07-29 2 views
2

확인하고 싶은 큰 ASCII 이미지가 대칭입니다. 나는 다음과 같은 파일이 말 :bash를 사용하여 ASCII 이미지의 균형을 어떻게 확인할 수 있습니까?

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

첫 번째 줄은 나는 그들이 모두 분리되어, 원하는 (그것은 비록 각 이제까지 시간 3 일 필요는 없습니다) 각 섹션의 같은 양을 것입니다, 다음 두 가지는 내가 원하는 것이 아닙니다. *의 수를 세어보고, 같은 양의 ^가 있고 M이 그 다음에 오는 것을 확인하고 싶습니다. 나는 각 라인에 대한 몇 가지 대칭을 얻으려고, 그래서 이것은 좋은 것 :

나는 파일을 통해 검색하고 어쩌면 문제 라인을 grep을 어떻게
**^^MM 
**********^^^^^^^^^^MMMMMMMMMM 
****^^^^MMMM 
*^M 
etc. 

? cat ASCIIfile | sed 's/\^//g' | sed 's/M//g' | wc -c으로 몇 개의 루프를 시도하고 변수에 출력을 할당 한 다음 다른 문자 수와 비교했지만 분명히 이것은 *^*^*M^MM과 같은 명령 및 행을 고려하지 않았습니다.

답변

2

사용하여 펄 :

perl -ne ' { $l=$_; chomp; ($v)=/^((.)\2*)/; $t=length($v); \ 
    s/M{$t}//;s/\^{$t}//;s/\*{$t}//; \ 
    print $l if length } ' input_file 

나오지 bash는/사용 :

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 
+0

'\ 1'은 (는) 경기를 대체하기 위해 어떻게 작동합니까? – bqui56

+0

\ 1이 첫 번째 캡처 그룹입니다. 이것은 정규 표현식의 첫 번째'\ (... \)'쌍으로 둘러싸인 부분입니다. 예를 들어's/[^ M] * \ ([M] [M] * \) [^ M] */\ 1 /'에서'\ 1'은'\ ([M] [ M] * \)', 즉 연속 된 M의 문자열. – perreal

+0

's/[^ M] * \ ([M] [M] * \) [^ M] */\ 1 /'모든 입력은 연속적인 M의 문자열로 대체됩니다. – perreal

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 

이 파일에서 읽어 while read -r string에 처음 for 루프를 변경하고 같은 li의 마지막에 done 뒤에 < filename을 추가하십시오. 네.

관련 문제