2016-01-23 89 views
3

我在使用bash的基本搜索功能時遇到了問題。使用awk的〜操作符

基本上,我有一個$文件=「Books.txt」,並在它我具有由冒號分隔值:

C++ Programming for Dummies:Bob:60:50:20 
Catch Me If You Can: Mary Ann:40:30:20 

第一兩列分別是標題和作者。我試圖按照書籍的標題進行搜索。

read -p "Title: " searchTitle 

到目前爲止,我有這樣的代碼:

awk -v findTitle="$searchTitle" 'BEGIN {FS=":"; OFS=", ";} $1 ~ findTitle {print $1, $2, "$"$3, $4, $5}' $file 

它的工作原理,如果我在提示符下鍵入 「捕獲」 - 輸出:

Catch Me If You Can, Mary Ann, $40, 30, 20 

但是,如果我搜索「C++ 「,它給我兩個 -

Catch Me If You Can, Mary Ann, $40, 30, 20 
C++ Programming for Dummies, Bob, $60, 50, 20 

我的任務離子是:爲什麼?結果,我應該只獲得'C++'書籍。是否有其他方法可以達到預期產出?我試圖找到答案,但無濟於事。

回答

2

您需要決定是否要在搜索中支持正則表達式。在任何情況下,您都必須使用讀取-r標誌來避免解釋轉義序列,而是將它們作爲文字文本讀取。

如果您想尋找固定的字符串,而不是模式,使用index()功能AWK:

read -r -p "Title: " searchTitle 
awk -F: -v OFS=", " -v search="$searchTitle" ' 
    index($1,search) { 
     print $1, $2, "$"$3, $4, $5 
    } 
' books.txt 

如果你想支持正則表達式,代碼應該是這樣的:

read -r -p "Title: " searchTitle 
awk -F: -v OFS=", " -v search="$searchTitle" ' 
    $1 ~ search { 
     print $1, $2, "$"$3, $4, $5 
    } 
' books.txt 

但是,如果它們出現在模式中,則需要轉義特殊的正則表達式字符。從C+++是這樣一個特殊的字符。

由於琴絃解析真實兩次,一次是用殼一旦被awk,你需要加倍逃避它:

Title: C\\+\\+ 
+1

這解決了這個問題!謝謝你,先生!我從現在開始更多地關注awk的手冊 –

+0

考慮搜索是否區分大小寫,如果不是,則在比較的兩邊應用'tolower()'。 –

0

這是因爲〜運算符的右值應該是在一個正則表達式正則表達式和+有特殊的意義(這是一個量詞:一次或多次)。

所以它的C來自「捕獲」和「C++」的C相匹配,因爲他們有一個或多個C.

,如果你要搜索的文本字符串「C++」,你必須寫「C\+\+

+0

啊..謝謝指點先生!還有一件事,如果是的話,我應該如何改進這些代碼,以便獲得預期的輸出結果? –

+0

@AdamWinfield:您只需要在搜索字符串中轉義特殊字符(如+)。看看hek2mgl答案,那就不需要使用〜運算符。我認爲這對你想做的事更合適。 –

+0

@CasimiretHippolyte有趣的是,沒有'-r'讀,你需要鍵入'C \\\\ + \\\\ +':D – hek2mgl