仅替换花括号外的文件中的字符串

时间:2016-06-21 16:06:50

标签: bash awk replace sed curly-braces

我需要替换文件中的一些字符串,但是当字符串在花括号内时,我需要跳过它。像

这样的东西
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 个答案:

答案 0 :(得分: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 :(得分: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