我无法将以前在论坛上回答的部分类似问题的不同建议和答案结合起来,所以我会问自己的问题,希望有人可以分享想法来解决这个问题: - )
所以这是项目:
\section{the title}
\status{Work in progress}
content
标题显然都是不同的,状态不同于"要做的事情"到"正在进行的工作"和#34;写作"。
\renewcommand{\TITLE}{the title}
\renewcommand{\STATUS}{\Doing}
\section{\TIT}
\STA
content
有什么想法吗? : - )
答案 0 :(得分:3)
正如@Beta所建议的那样,您应该将问题分解为几个可以独立解决的子问题。让我们首先找到一种方法来转换部分,然后是状态,然后结合两者,最后但并非最不重要的是,将所有这些结合起来运行在几个文件上。
我们可以使用sed
来检测各个部分,并将它们转换为两行:renewcommand和new section。
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
。
在尝试进行此类转换之前,我会确保您备份(或版本控制)所有文件。只是为了确保您可以在出现问题时回滚。
我希望这会有所帮助。