在bash脚本中使用sed来替换LaTeX别名



我对bash脚本还比较陌生,对LaTeX没有任何经验。我被要求开发一个脚本,它将用更繁琐的长格式等价物取代LaTeX文档中的方便快捷方式。

到目前为止,我的方法是在单独的变量中隔离快捷形式和长形式,然后尝试使用sed在文本中替换它们。我在下面附上了一些简短的示例文件。

目前,脚本有两个参数,一个是文件expr,它从中检索快捷方式和长格式术语,另一个是infile,应该对其进行适当的更改。我知道这个脚本正确地隔离了快捷方式和长格式,并且可以返回它们,但它似乎无法执行sed命令。

我试着在网上搜索了一下,发现了多个类似的问题,其中建议sed很难识别变量,各种类型的报价组合可能会解决这个问题。我试过很多种排列,但似乎都不起作用。在许多情况下,长格式术语包含特殊字符,如"$"one_answers"{}",所以我怀疑这可能是问题所在,但我不确定。关于如何解决这个问题,我也对其他想法持开放态度。请在下面找到脚本和两个参数文件(expr和infile)的示例。

包含快捷方式和长格式的expr文件

% a
newcommand{ao}{$^{18}$O}
newcommand{aodso}{$^{18}$O/$^{16}$O}
% b
newcommand{bea}{begin{equation}}
newcommand{beaa}{begin{eqnarray}}
% c
newcommand{cthree}{C$_3$}
newcommand{cfour}{C$_4$}
newcommand{coz}{CO$_2$}

包含要用长格式替换的快捷方式的内野文件

This is my test {ao} 
{aodso} my test is this
Does it work {bea}
{beaa} test test test
work work work {cthree}
{cfour} This is my test
my test is this {coz}

以expr和infile为自变量调用的脚本的相关子段

while read line; do
    if [[ $line == newcommand* ]]; then
    temp=${line#*{}
    sc=${temp%%}*} 
    templf=${temp#*{}
    lf=${templf%}}
    #echo $sc, $lf
    sed -i -e 's/${sc}/${lf}/g' ${infile}
    fi
done < ${expr}

更新:为了澄清,这就是想要的结果,内野中的捷径将被适当的长形式取代

This is my test {$^{18}$O}
{$^{18}$O/$^{16}$O} my test is this
Does it work {begin{equation}}
{begin{eqnarray}} test test test
work work work {C$_3$}
{C$_4$} This is my test
my test is this {CO$_2$}

GNU sed代码:

sed -r '/^%/d;s#.*b({\w+})({.*})#1 2#;s#\#\\#g;s#(S+)s(S+)#\|1|s|1|2|g#' file1|sed -f - file2

$cat文件1%a\新命令\新命令%b\newcommon{\bea}{\begin{equation}}\newcommand{\beaa}{\bbegin{eqnarray}}%c\新命令{\ct三}{C$_3$}\新命令{\cf our}{C$_4$}\newcommand{\coz}{CO$_2$}$cat文件2这是我的测试我的测试是这个它有效吗{\bea}测试测试工作这是我的测试我的测试是这个$sed-r"/^%/d;s#.*\b(\{\\w+\}这是我的测试{$^{18}$O}{$^{18}$O/$^{16}$O}我的测试是它起作用吗{\begin{eqnarray}}测试测试工作工作{C$_3$}{C$_4$}这是我的测试我的测试是这个{CO$_2$}

说明:

sed有两个调用,第一个调用从具有搜索/替换模式的文件中生成sed脚本:

sed-r'/^%/d;s#.*\b(\{\\\\w+\};s#\\\#\\\#g;文件1\|{\\ao}|s|{\\ao}|{$^{18}$O}|g\|{\\aodso}|s|\|{\bea}|s|{\bia}|{\\begin{equation}}|g\|{\\beaa}|s|{\\beaa}|{\\ begin{eqnarray}}|g\|{三个}|s|{三}|{C$_3$}|g\|{\\cfour}|s|{\\cfgour}|{C$_4$}|g\|{\\coz}|s|{\\coz}|{CO$_2$}|g

在第二个调用中,sed用文本文件处理该脚本以进行替换。

sed -f - file2

在tex.SE上有很多关于这个问题的讨论。但我要借此机会指出,那里(IMO)的最佳答案是使用de-macro程序,这是TeXLive附带的python脚本。它功能强大,可以处理参数以及简单的替换。

要使用它,请将要展开的宏移动到<something>-private.sty文件中,并使用usepackage{<something>-private}将其包含在文档中,然后运行de-macro <mydocument>。它吐出了<mydocument>-private.tex,它与您原来的一样,但您的私有宏被它们更基本的东西所取代。

我知道这个问题很长一段时间以来就被标记为已回答,并且您明确提到bash和sed是您想要的工具。

然而,为了其他人的利益,如果你不坚持使用bash和sed,那么你的问题还有其他选择,例如perl脚本TME(正如SO中建议的那样)。用法:

tme  [ -c ]  [ -D | -Dn ]  [ macros.tex ... ]  <input.tex  >output.tex

相关内容

  • 没有找到相关文章

最新更新