2014-12-23 66 views
1

我在input.txt文件中有以下字符串。如果循環與OR

Running 
isn't running 
is running 
Stopped 
stopped 
Aborted 
aborted 

在這裏,我需要匹配除「運行」和「正在運行」之外的所有內容。到目前爲止,我已經完成了下面的工作,但它似乎正在打印「運行」和「正在運行」。可以幫助嗎?

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 ]] || [[ $line =~ [Ss]topped ]] || [[ $line =~ isn*t ]] 

相當於該

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

因爲 「或」 運營商||比正則表達式匹配運算=~

由於更高的優先級最後2個條件總是如此,每條線都通過。

還請注意,您在使用glob模式使用正則表達式匹配操作符,所以這[[ $line =~ isn*t ]]不匹配isn't,它將匹配ist零或之間有更多n。 (istisntisnnt等)

你打算寫這個

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

這是微塵簡明寫有情況:

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

這是我回答的倒數。

+0

謝謝..但你能告訴我的代碼中有什麼問題嗎? – user3834663

1

爲什麼不使用grep?

grep -v "unning" < input.txt 

給你想要的行。

+0

我需要匹配的確切單詞 – user3834663