Bash 仅在大括号外替换文件中的字符串

Bash 仅在大括号外替换文件中的字符串,bash,awk,replace,sed,curly-braces,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执行。非常感谢 样本输

我需要替换文件中的一些字符串,但当字符串位于大括号内时,我需要跳过它。差不多

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=长度()
rec=“”
为了(charNr=1;charNr只是为了好玩

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

bar{foo
foo}bar
这样的字符串应该怎么办?嵌套的卷发应该怎么办?
foo{foo}foo
foo{foo}foo}foo}foo
。请用上述评论中询问的信息更新问题。问题本身目前还不清楚。大括号内的任何内容基本上都应该输入,不管是否有其他大括号。因此,您示例的结果将是bar{foo{foo}foo}bar和bar{foo}bar{foo}bar.Yes Ed,这就是我的意思,使用单个正则表达式使用标准shell实用程序几乎是不可能的。这是取代任何基于正则表达式的解决方案的正确方法++是吗?。此外,这里每行使用两次gsub(),调用gsub()每行两次都不是问题。我们将看看是否有人提出了基于regexp的解决方案进行比较。检查我的..我承认我只是好奇。我可能会输掉那场比赛
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