Bash:根据条件删除花括号

Bash:根据条件删除花括号

我想从下面的字符串中删除大括号,但前提是 * 在它们之间找到大括号。

我在这个主题上找到了很多答案,但在我的场景中,我只想删除那些满足条件的大括号,即{*} --> *.

name,apple,price,{50 70 80 80},color,{*}
name,orange,price,{*},color,{80 30 40}

预期输出:

name,apple,price,{50 70 80 80},color,*
name,orange,price,*,color,{80 30 40}

请帮忙,提前致谢。

答案1

使用sed'ss命令(如替代) - 在 中包含大括号regexp,但不在 中replacement

sed 's/{\*}/*/g'

答案2

只需 bash

line='name,orange,price,{*},color,{80 30 40}'
s='{*}'
echo "${line//"$s"/*}"
name,orange,price,*,color,{80 30 40}

我不知道如何进行转义,以便s不需要该变量。

请注意,双引号是必需的,否则您会得到:

$ echo "${line//$s/*}"
name,orange,price,*

答案3

命令

sed "/{\*}/s/{\*}/*/g" filename

输出

name,apple,price,{50 70 80 80},color,*
name,orange,price,*,color,{80 30 40}

方法2

awk '$0 ~ "{*}" {gsub (/{\*}/,"*",$0);print }'  filename

输出

name,apple,price,{50 70 80 80},color,*
name,orange,price,*,color,{80 30 40}

相关内容