Shell:仅替换大括号内的字符?

Shell:仅替换大括号内的字符?

我有大量的文件集,包含以下格式化行。我需要|仅将字符替换为空白,{"USER":"AD","DESCRIPTION":"\"<some non english characters> |\n<some non english characters>","LINK":"sample"}其中包含左大括号和右大括号。所以对于下面的文字

|||||samA|sam2||||{"USER":"AD","DESCRIPTION":"\"<some non english characters>  |\n<some non english characters>","LINK":"sample"}||||data|string|

输出是

|||||samA|sam2||||{"USER":"AD","DESCRIPTION":"\"<some non english characters>  \n<some non english characters>","LINK":"sample"}||||data|string|

我已经尝试了各种 sed 格式来执行此操作几个小时,但仍然没有成功。我有办法做到这一点吗?

答案1

总而言之:

sed  '/{[^}]*|/{:a;s/\({[^}]*\)|\([^}]*}\)/\1 \2/;ta}'

简短说明:

/{[^}]*|/-- 仅过滤具有我们将应用更改的模式的行(实际上该部分可以删除,但可能会加快大文件的处理速度)

:a;...;ta-- 一个循环,它将迭代行直到替换语句没有改变任何内容。如果您有多个|内部花括号,则需要

s/\({[^}]*\)|\([^}]*}\)/\1 \2/;将替换|里面的花括号。一次一个。

相关内容