我需要替换文件中的一些字符串,但是当字符串位于大括号内时,我需要跳过它。类似的东西
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
最佳答案
$ 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
关于bash - 仅替换文件中大括号外的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37949440/