将匹配的括号替换为封闭的内容

将匹配的括号替换为封闭的内容

在 bash 中使用 sed/awk 查找匹配的连续括号并用其包含的内容替换它们的简单方法是什么?

一个最小的例子是:

输入:

(body1)

输出:

body1

解决方案不足:

这可以用以下方法完成

echo "(body1)" | sed 's/[()]//g'

扩展问题

但简单地删除所有左/右括号是不够的,因为最终目标是从源文件中删除某些而不是所有(tex)命令,例如

输入:

Alea {\color{red}iacta} est. \textbf{Hic} forum est, populus {\color{red}properant}.

输出:

Alea iacta est. \textbf{Hic} forum est, populus properant.

到目前为止,我只能使用以下方法提取文本:

awk -v FS="({\\color{red}|})" '{print $2}' $file.tex

奖金

可以sed -E 's/\{\\color\{red}([^{}]*)\}/\1/g'只删除 \color{red} 命令 - 但是,命令的开始和结束需要在同一行。

如何删除右括号前跨多行的命令}

奖金解决方案

如果有人感兴趣,以下命令似乎可以解决奖金问题: sed -i -r 's#\{\\color\{red\}([^}]*)\}#\1#g' $file.tex sed -i -r ':a;N;$!ba;s#\{\\color\{red\}([^}]*)\}#\1#' $file.tex

第一个命令删除一行中所有的{\color{red}和。}第二个命令删除跨越多行的所有对。

答案1

即使您一开始提出的简单问题也隐藏着一些复杂性。我会开始

sed -E 's/\(([^()]*)\)/\1/'

重复直到没有括号。这替换了最里面的文本:

$ echo "((body))" | sed -E 's/\(([^()]*)\)/\1/'
(body)

正如建议的善行难陀不过,要剥离 TeX 命令,您应该检查detexTeX Live(以及大多数发行版)中可用的命令。这种处理需要的不仅仅是匹配的括号或大括号:您需要了解一些有关各种命令的行为。即使在您的示例中,也\color需要以一种方式、\textbf另一种方式进行处理......

相关内容