2017-09-25 38 views
0

使用grep下面的正則表達式似乎並不奏效: grep "(?=\_\(\").*?(?=\"\))" ./testfile.js爲什麼這個grep <regex>無法正常工作?

testfile.js如下:

asoijf oaisdjf _("string 1") fodijsasf _("string 2") 
fasdoij _("string 3"); 
console.log(_("string 4")); 

我的目標就是抓住封閉在所有字符串_()函數調用,沒有greps -P標誌(這個選項對我來說不存在)。預期的輸出將是:

string 1 
string 2 
string 3 
string 4 

任何想法的?

更新:-P標誌從慶典在我的版本的Mac的去除(見grep -P no longer works how can I rewrite my searches

+0

*?總是給我帶來問題。嘗試:_ \(「([^」] +)「\)如果可行我會寫出一個很好的答案 – sniperd

+1

grep的正則表達式語法與您可能習慣的語法不同, (?= ...)'或者非貪婪的'*?'。 –

+0

@JohnKugelman它用'-P'來支持所有這些, – 123

回答

1

能否請您嘗試以下的awk,讓我知道,如果這可以幫助你。

grep -oE '_\([^\)]*' Input_file | cut -c3- 

輸出如下。

"string 1" 
"string 2" 
"string 3" 
"string 4" 

編輯:由於OP沒有-P選項在它的O.S所以這裏提供一個awk的辦法了。

awk '{ 
    while($0){ 
    match($0,/_\([^\)]*/); 
    st=RSTART; 
    le=RLENGTH; 
    if(substr($0,RSTART+2,RLENGTH-2)){ 
     print substr($0,RSTART+2,RLENGTH-2) 
}; 
    $0=substr($0,st+va+3) 
} 
} 
' Input_file 
+1

這錯過了字符串2 – 123

+0

我認爲只有第1應該被挑選,現在編輯它,thanks。 – RavinderSingh13

+0

-P標誌對我來說不起作用,這是否與沒有安裝perl有關? – Nodeocrat

0
grep -oP '_\("\K[^"]+' inputfile 
string 1 
string 2 
string 3 
string 4 

這裏,-o只打印匹配的結果,而不是整條生產線。 \K將用於後面的外觀,意思匹配\K左邊的字符串,但不打印它。 [^"]+表示除了"以外的任何時間。

或者不-P選項:

grep -oE '_\("[^"]+' inputfile|cut -d'"' -f2 
string 1 
string 2 
string 3 
string 4 
相關問題