我不能成功地将不同的建议和答案结合起来,对论坛上之前回答的部分相似的问题,所以我会问我自己的问题,希望有人能分享解决这个问题的想法:-)
下面是一个项目:
输入文件如下所示:
\section{the title}
\status{Work in progress}
content
标题显然各不相同,从“待办”到“正在进行中的工作”和“写”,地位各不相同。
所需产出:
\renewcommand{\TITLE}{the title}
\renewcommand{\STATUS}{\Doing}
\section{\TIT}
\STA
content
赛义德
有什么想法吗?:-)
发布于 2018-04-30 10:30:51
正如@Beta所建议的,您可能应该将您的问题分解为几个子问题,您可以独立解决。让我们首先找到一种转换节的方法,然后是状态,然后将两者结合起来,最后,但并非最不重要的是,将所有这些组合起来运行在多个文件上。
转换标题(一个文件)
我们可以使用sed
来检测区段,并将它们转换为两行:更新命令和新区段。
sed -r 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g'
它的工作方式如下:
echo '\section{The title}' | sed -r 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g'
将产生以下结果:
\renewcommand{\TITLE}{The title}
\section{\TIT}
转换状态(一个文件)
我们可以对状态应用非常类似的转换:
sed -r 's/\\status\{([^}]+)\}/\\renewcommand{\\STATUS}{\1}\n\\STA/g'
这将改变:
\status{Work in progress}
转入:
\renewcommand{\STATUS}{Work in progress}
\STA
合并两者(一个文件)
现在,您可以很容易地将一个sed应用于给定的文件:
sed -ir \
-e 's/\\status\{([^}]+)\}/\\renewcommand{\\STATUS}{\1}\n\\STA/g' \
-e 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g' filename.tex
这将将两个转换应用于filename.tex
并对其进行就地更改。
应用于多个文件
现在,您可以对文件夹中的所有文件(递归地)应用这个sed
命令,使用find
和xargs
来调用每个文件的命令:
find . -name '*.tex' -print0 | xargs -0 -I{} sed -ri \
-e 's/\\status\{([^}]+)\}/\\renewcommand{\\STATUS}{\1}\n\\STA/g' \
-e 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g' {}
find . -name '*.tex' -print0
将递归地列出所有tex
文件。然后,| xargs -0 -I{} command {}
将对每个单独的文件调用command
。
在尝试这样的转换之前,我会确保您备份(或版本控制)所有文件。只是为了确保你可以退回去以防出了什么问题。
我希望这能帮到你。
https://stackoverflow.com/questions/50087464
复制相似问题