2014-12-23 3 views
1

input.txt 파일에 다음 문자열이 있습니다.OR을 사용하여 루프가있는 경우

Running 
isn't running 
is running 
Stopped 
stopped 
Aborted 
aborted 

저는 여기에 "실행"과 "실행"을 제외한 모든 일치해야합니다. 지금까지 나는 아래에서 해봤지만 "Running"과 "running"을 인쇄하는 것으로 보인다. 도움이 될까요?

exec < input.txt 
while read line 
do 
    if [[ $line =~ [Aa]borted || [Ss]topped || isn*t ]]; then 
     echo "$line" 
    else 
     echo "FINE" 
    fi 
done 

답변

0
grep -vE '\<(R|is r)unning\>' input.txt 

\<\> 마커, 단어 경계이다

while IFS= read -r line; do 
    case $line in 
    *"Running"* | *"is running"*) echo FINE ;; 
    *) echo "$line" ;; 
    esac 
done < input.txt 

문제 코드에서이 라인

[[ $line =~ [Aa]borted || [Ss]topped || isn*t ]] 

[[ $line =~ [Aa]borted ]] || [[ -n "[Ss]topped" ]] || [[ -n "isn*t" ]] 

등가

[[ $line =~ [Aa]borted ]] || [[ $line =~ [Ss]topped ]] || [[ $line =~ isn*t ]] 

일치하지 인은 "또는"연산자 || 정규식 일치 연산자 =~

보낸 사람보다 높은 우선 순위를 가지고 있기 때문에 마지막 두 조건은 항상 true이고 각 행은 통과합니다.

정규 표현식 매치 연산자 글로브 패턴을 사용하고도 참고, 그래서이 [[ $line =~ isn*t ]]는 0 또는 그 사이에 n 더와 ist 일치합니다, isn't 일치하지 않습니다. 내 대답의 역이다

case $line in 
    [Aa]borted | [Ss]topped | isn*t) echo "$line" ;; 
    *) echo FINE ;; 
esac 

: (ist, isnt, isnnt 등)

당신은 간결 경우 작성 티끌입니다이

[[ $line == [Aa]borted || $line == [Ss]topped || $line == isn*t ]] 

를 작성하는 목적.

+0

고맙습니다.하지만 내 코드에 무엇이 잘못 되었습니까? – user3834663

1

왜 grep을 사용하지 않습니까?

grep -v "unning" < input.txt 

원하는 줄을 제공합니다. 당신이

쉘에서 "이 실행"을 필터링하지 않도록

+0

정확하게 일치해야합니다. – user3834663

관련 문제