如何通过find,exec和sed在变量前加上变量?

时间:2018-04-29 14:08:35

标签: bash sed find latex

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

所以这是项目:

  • 我有很多.tex文件
  • 我使用一种元数据将它们重组为更好的管理(系统化)系统
  • 他们都应该标记我想要重塑的线条。

输入文件如下所示:

\section{the title}
\status{Work in progress}

content

标题显然都是不同的,状态不同于"要做的事情"到"正在进行的工作"和#34;写作"。

所需的输出:

\renewcommand{\TITLE}{the title}
\renewcommand{\STATUS}{\Doing}

\section{\TIT}

\STA

content

依达拉奉

  • 标题需要保持不变(这就是为什么我认为我需要一个变量)
  • 状态需要标准化
  • 部分前置文字已系统化

有什么想法吗? : - )

1 个答案:

答案 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并将其更改为原位。

应用于多个文件

现在,您可以使用sedfind对文件夹中的所有文件(递归)应用此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

在尝试进行此类转换之前,我会确保您备份(或版本控制)所有文件。只是为了确保您可以在出现问题时回滚。

我希望这会有所帮助。