我无法成功将不同的建议和答案结合起来,以在论坛上回答的部分类似问题,所以我会问我自己的问题,希望有人可以分享想法来解决这个问题: - (
所以这是项目:
- 我有很多.tex文件
- 我正在使用一种元数据将它们重组为更好的管理(系统化(系统
- 他们都应该重塑标签线。
输入文件看起来像这样:
section{the title}
status{Work in progress}
content
标题显然都不同,并且状态从"到"到"正在进行中的工作"one_answers" writen"。
所需的输出:
renewcommand{TITLE}{the title}
renewcommand{STATUS}{Doing}
section{TIT}
STA
content
imissis
- 标题需要保持不变(这就是为什么我想我需要变量(
- 状态需要标准化
- 预期文本的一部分被系统化
有什么想法吗?: - (
正如@beta所建议的那样,您可能应该将问题分解成几个可以独立解决的子问题。首先,让我们找到一种方法来转换部分,然后将状态结合,然后将两者结合起来,最后并非最不重要的一点是,将所有这些组合在多个文件上运行。
变换标题(一个文件(
我们可以使用 sed
检测部分并将其转换为两行:reenewcommand和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
并就位更改。
应用多个文件
现在,您可以使用find
和xargs
在文件夹中的所有文件上应用此sed
命令来调用每个文件上的命令:
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
。
我将在尝试此类转换之前确保您的备份(或版本控制(所有文件。只是为了确保您可以回滚,以防万一出现问题。
我希望这会有所帮助。