2016-06-21 105 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 
相关问题