2013-05-15 70 views
2

我似乎無法弄清楚如何在如果語句中正確編寫正則表達式。我希望它能打印出所有包含「結束日期」的行。Shell腳本:RegEx in if語句

號碼包含以下內容的文本文件:

End Date ABC ABC ABC ABC ABC ABC 
05/15/13 2 7 1 1 4 5 
04/16/13 4 3 0 1 3 6 
03/17/13 6 9 3 8 5 9 
02/18/13 8 2 7 1 0 1 
01/19/13 1 9 2 2 5 2 
12/20/12 7 2 7 1 0 1 

這裏是我的代碼片段,我與有問題:

if [ -f $NUMBERS ] 
then 
     while read line 
     do 
       if [ $line = ^End ] 
       then 
         echo "$line" 
       else 
         echo "BROKEN!" 
         break     
       fi 
     done < $NUMBERS 
else 
     echo "===== $NUMBERS failed to read =====" 
fi 

輸出是:

破碎!

+0

你不需要的東西,正則表達式這個簡單:'[[$線==結束*]' –

+0

請問您的文件實際上包含了'>'字符在每行的開始? –

+0

@glennjackman我正在爲具有日期的正則表達式做正則表達式,但它不起作用,所以我在第一行做了確保沒有錯誤的地方。實際文件不包含「>」。 – dalawh

回答

5

如果你正在使用bash,試試=~

... 
if [[ $line =~ ^End ]] 

請注意,以下將不起作用:1

if [[ "$line" =~ "^End" ]] 
+0

請注意,這不適用於所有外殼。 –

+0

@datguy「=〜」做什麼? – dalawh

+0

@dalawh'=〜'告訴bash匹配正則表達式而不是字符串。 – Kevin

3

您可以使用以下方法來檢查line開始與End

if [[ "$line" == End* ]] 

如果你想使用正則表達式,你可以使用下面的代碼。

if [[ "$line" =~ ^End* ]] 

http://tldp.org/LDP/abs/html/comparison-ops.html

也要注意,建議始終引用您的變量。

http://tldp.org/LDP/abs/html/quotingvar.html

+0

我認爲=和==沒有區別。在那兒?另外,與使用一個[]和兩個[]有什麼不同? – dalawh

+0

'if [「$ a」=「$ b」]' - 進行字符串比較,但帶'[[]]'的== ==可用於正則表達式搜索。請看我在答案中給出的鏈接。希望能幫助到你。從該鏈接複製 - 「」==比較運算符在雙括號測試中的行爲與單括號內的行爲不同。「' – Bill

+0

這最終不起作用。我用「=〜」,它工作。 – dalawh

2

的便攜式解決方案是使用case支持通配符出如果盒子。語法有點怪異,但你習慣了。

while read line; do 
    case $line in 
     End*) ... your stuff here 
      ... more your stuff here 
      ;; # double semicolon closes branch 
    esac 
done