2015-11-04 62 views
1

我想刪除函數「engine」map「{...」foobar「...}」。使用sed或awk從文件中刪除功能

我在很多方面嘗試,它很難,因爲它在結束的空行和「}」分隔符不起作用

mainfunc { 

    var = "baz" 

    engine "map" { 

    func { 

     var0 = "foo" 
     border = { 1, 1, 1, 1 } 
     var1 = "bar" 
    } 
    } 
} 

mainfunc { 

    var = "baz" 

    engine "map" { 

    func { 

     var0 = "foo" 
     border = { 1, 1, 1, 1 } 
     var1 = "foobar" 
    } 
    } 
} 

... # more functions like 'mainfunc' 

我試圖

sed的「/發動機/,/^\ S \ S} $/d」文件

但刪除了每個引擎功能,我只需要包含‘foobar的’,也許是模式匹配的一切,甚至換行,直到foobar的是這樣的一種:

sed的 '/engine(.*)foobar/,/^\s\s}$/d' 文件

I'ts可能嗎?

回答

1

嘗試:

sed '/engine/{:a;N;/foobar/{N;N;d};/ }/b;ba}' filename 

或:

awk '/engine/{c=1}c{b=b?b"\n"$0:$0;if(/{/)a++;if(/}/)a--;if(!a){if(b!~/foobar/)print b;c=0;b="";next}}!c' filename 
+0

人,你搖滾! 謝謝! – Ferragam

0

我會簡單的計數打開/關閉括號的數量,當你匹配engine "map",不能如果GAWK這隻能

awk ' 
    /^[ \t]*engine "map"/ { 
    ship=1; # ship is used as a boolean 
    b=0 # The factor between open/close brackets 
    } 
    ship { 
    b += split($0, tmp, "{"); # Count numbers of { in line 
    b -= split($0, tmp, "}"); # Count numbers of } in line 
    # If open/close brackets are equal the function ends 
    if(b==0) { 
     ship = 0; 
    } 
    # Ship the rest (printing) 
    next; 
    } 
    1 # Print line 
' file 

斯普利特返回匹配的數目說:split(string, array [, fieldsep [, seps ] ])

將 字符串分爲由fieldpat 定義的部分,並將數組中的部分和 seps數組中的分隔符字符串進行存儲。第一部分儲存在 array[1],第二部分在array[2]之後,等等 。第三個參數fieldpat是 一個描述字符串中字段的正則表達式(就像FPAT是描述輸入記錄中字段的正則表達式 一樣)。 它可能是一個正則表達式常量或一個字符串。 如果省略fieldpat,則使用FPAT的值。 patsplit()返回創建的元素的數量。