如何通过查找,执行和SED使用变量来启动线路



我无法成功将不同的建议和答案结合起来,以在论坛上回答的部分类似问题,所以我会问我自己的问题,希望有人可以分享想法来解决这个问题: - (

所以这是项目:

  • 我有很多.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并就位更改。

应用多个文件

现在,您可以使用findxargs在文件夹中的所有文件上应用此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

我将在尝试此类转换之前确保您的备份(或版本控制(所有文件。只是为了确保您可以回滚,以防万一出现问题。

我希望这会有所帮助。

最新更新