sed-删除一行中除最后一次出现的字符之外的所有字符

sed-删除一行中除最后一次出现的字符之外的所有字符

假设我有一些像

author = {Bill Catsman},
title = {{Hello} {{Cruel} {World}}}

我想要删除除第一个和最后一个括号之外的所有括号title。我可以sed -r 's/title\ \=\ \{//2g'删除多余的{s,但是如何删除多余的}s?

期望输出是

author = {Bill Catsman}, 
title = {Hello Cruel World}

答案1

要删除所有出现的{或,}只要它们是里面其他{...}

$ sed -E ':a; s/(\{.*)[{}](.*\})/\1\2/; ta' file
author = {Bill Catsman},
title = {Hello Cruel World}

其效果是仅保留外部花括号。

怎么运行的:

  • :a

    这定义了一个标签a

  • s/(\{.*)[{}](.*\})/\1\2/

    这将查找另一组花括号内的花括号并将其删除。

  • ta

    如果最后代替命令对该行进行了更改,然后跳转到标签a并重试。

相关内容