我需要替换文件中的一些字符串,但是当字符串在花括号内时,我需要跳过它。像
这样的东西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
答案 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