![Shell:仅替换大括号内的字符?](https://linux22.com/image/164808/Shell%EF%BC%9A%E4%BB%85%E6%9B%BF%E6%8D%A2%E5%A4%A7%E6%8B%AC%E5%8F%B7%E5%86%85%E7%9A%84%E5%AD%97%E7%AC%A6%EF%BC%9F.png)
我有大量的文件集,包含以下格式化行。我需要|
仅将字符替换为空白,{"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/;
将替换|
里面的花括号。一次一个。