2015-06-04 211 views
3

我試圖在兩個模式之間打印文本文件的一部分,然後只返回第一個匹配項。應該很簡單,但我似乎無法找到解決方案。awk在匹配後打印第一個匹配項

貓的test.html

if (var == "Option_1"){ 
    document.write("<td>head1</td>") 
    document.write("<td>text1</td>") 
} 
if (var == "Option_2"){ 
    document.write("<td>head2</td>") 
    document.write("<td>text2</td>") 
} 
if (var == "Option_1"){ 
    document.write("<td>head3</td>") 
    document.write("<td>text3</td>") 
} 

這將打印所有匹配:

awk '/Option_1/,/}/' test.txt 

我需要它來只返回第一個,即:

if (var == "Option_1"){ 
    document.write("<td>head1</td>") 
    document.write("<td>text1</td>") 
} 

謝謝!

回答

1

你可以做,

awk '/Option_1/,/}/{print; if ($0 ~ /}/) exit}' test.txt 

這將退出打印第一場比賽

+0

是的,我試過那個......但它只返回第一次出現的第一個'行'。謝謝,不過。 – syntax

+0

對不起,我修改了它。再試一次。 – bkmoney

+0

就是這樣。謝謝bkmoney! – syntax

1

我以爲後面還有沒有}內如果塊。

使用GNU sed的:

sed -n '/Option_1/{:a N;s/}/}/;Ta;p;q}' file 

下面是它如何工作的:

/Option_1/{  #search for Option_1 
    :a   #create label a 
    N;   #append next line to pattern space 
    s/}/}/;  #substitute } with } 
    Ta;   #if substitution failed, jump to label a 
    p;   #print pattern space 
    q   #exit 
} 
+1

簡單:'/ Option_1/{:a;磷; /}/Q; N; ba}' –

+0

好點,但沒有'-n'選項就不需要'p' – Alfwed

+2

您需要-n選項,否則所有其他行都會打印如果我們說您搜​​索Option_2 – bkmoney

8

切勿使用範圍表達式爲他們做瑣碎的工作非常輕微簡短但隨後需要一個完全重寫或重複的條件,甚至稍微有趣的任務。始終使用標誌:

$ awk '/Option_1/{f=1} f{print; if (/}/) exit}' file 
if (var == "Option_1"){ 
    document.write("<td>head1</td>") 
    document.write("<td>text1</td>") 
} 
+0

我不知道我們可以簡單地使用'if(/ pattern /)' – anishsane

+1

好東西。謝謝埃德。 – syntax

+0

@anishsane - yes'/ foo /'是'$ 0〜/ foo /'的縮寫,無論您在條件環境中使用它。 –

2

有所添加到埃德莫頓的回答,您可以再次寫入到一些嵌套的工作,如果條件或者存在其他任何一對大括號的if語句中(如括號爲。循環)。

awk '/Option_1/{f=1} f{ if(/{/){count++}; print; if(/}/){count--; if(count==0) exit}}' filename 

輸出:

if (var == "Option_1"){ 
    document.write("<td>head1</td>") 
    if (condition){ 
    //code 
    } 
    document.write("<td>text1</td>") 
} 
if (var == "Option_2"){ 
    document.write("<td>head2</td>") 
    document.write("<td>text2</td>") 
} 
if (var == "Option_1"){ 
    document.write("<td>head3</td>") 
    document.write("<td>text3</td>") 
} 

是:

if (var == "Option_1"){ 
    document.write("<td>head1</td>") 
    if (condition){ 
    //code 
    } 
    document.write("<td>text1</td>") 
} 

count將繼續首發大括號的數量計數,直到計數再次達到0將打印語句。

我的輸入可能與問題不同,但信息可能有用。

+2

你在混淆awk和shell語法。在awk'((count + = 1))'中,你不需要在算術運算符周圍配對parens,一個簡單的'count ++'就可以做到這一點。除了第一個塊以外,你的腳本將會失敗,請嘗試使用'/ Option_2 /'。 –

+1

謝謝@EdMorton找出我的錯誤。我已經更新了我的答案,現在似乎對任何選項都能正常工作。 –

1
sed '/Option_1/,/}/ !d;/}/q' YourFile 
  • 刪除一切不是你符內,它的最後一行(只有這麼1節)
  • 非GNU的sed後退出,由一個真正的新行更換;d