2016-06-21 109 views
2

我需要替換文件中的一些字符串,但是當字符串位於大括號內時,我需要跳過它。像僅在大括號外的文件中替換字符串

sed -i '/[^{].*foo.*[^}]/ s/foo/bar/g' test.f 

測試文件test.f包含的東西是這樣的:

bar foo {foobar}bar {foo} 

這應該未包裹在括號中的字符串中僅搜索FOO。所以結果應該是:如果字符串開頭的括號

bar bar {foobar}bar {foo} 

一切都應該被忽略,即在符合「{」應該到相應的忽略「}」。

這不一定要由sed執行。非常感謝。

樣品輸入:

bar foo {foobar}bar {foo} 
foo { foo { foo } foo } foo 
foo { foo } foo { foo } foo 

預期輸出:

bar bar {foobar}bar {foo} 
bar { foo { foo } foo } bar 
bar { foo } bar { foo } bar 
+2

像bar {foo'或'foo} bar'這樣的字符串會發生什麼? – choroba

+2

嵌套捲曲會發生什麼? 'foo {foo {foo} foo} foo'與'foo {foo} foo {foo} foo'。 – choroba

+1

請用上述評論中提供的信息更新問題。這個問題本身目前還不清楚.. –

回答

3
$ cat tst.awk 
{ 
    gsub(/foo/,RS) 
    numChars = length() 
    rec = "" 
    for (charNr=1; charNr<=numChars; charNr++) { 
     char = substr($0,charNr,1) 
     if (char == "{") { depth++ } 
     if (char == "}") { depth-- } 
     rec = rec ((char == RS) && (depth == 0) ? "bar" : char) 
    } 
    gsub(RS,"foo",rec) 
    print rec 
} 

$ awk -f tst.awk file 
bar bar {foobar}bar {foo} 
bar { foo { foo } foo } bar 
bar { foo } bar { foo } bar 
+1

這是正確的方式去代替任何基於正則表達式的解決方案++ – anubhava

+0

是嗎?此外gsub()甚至在這裏每行使用兩次 – hek2mgl

+0

每行調用gsub()兩次不成問題。我們會看看是否有人提出了基於正則表達式的解決方案進行比較。 –

0

只是爲了好玩!

awk '{sub(/foo/,"bar")}{sub(/ foo$/," bar")}{sub(/} foo {/,"} bar {")}1' file 
bar bar {foobar}bar {foo} 
bar { foo { foo } foo } bar 
bar { foo } bar { foo } bar 
相關問題