在 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 命令,您应该检查detex
TeX Live(以及大多数发行版)中可用的命令。这种处理需要的不仅仅是匹配的括号或大括号:您需要了解一些有关各种命令的行为。即使在您的示例中,也\color
需要以一种方式、\textbf
另一种方式进行处理......