首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过find、exec和sed在行中添加变量?

如何通过find、exec和sed在行中添加变量?
EN

Stack Overflow用户
提问于 2018-04-29 14:08:34
回答 1查看 85关注 0票数 0

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

下面是一个项目:

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

输入文件如下所示:

代码语言:javascript
运行
复制
\section{the title}
\status{Work in progress}

content

标题显然各不相同,从“待办”到“正在进行中的工作”和“写”,地位各不相同。

所需产出:

代码语言:javascript
运行
复制
\renewcommand{\TITLE}{the title}
\renewcommand{\STATUS}{\Doing}

\section{\TIT}

\STA

content

赛义德

  • 标题需要保持不变(这就是为什么我想我需要一个变量)
  • 地位需要标准化
  • 部分加注文本已系统化。

有什么想法吗?:-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-30 10:30:51

正如@Beta所建议的,您可能应该将您的问题分解为几个子问题,您可以独立解决。让我们首先找到一种转换节的方法,然后是状态,然后将两者结合起来,最后,但并非最不重要的是,将所有这些组合起来运行在多个文件上。

转换标题(一个文件)

我们可以使用sed来检测区段,并将它们转换为两行:更新命令和新区段。

代码语言:javascript
运行
复制
sed -r 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g'

它的工作方式如下:

代码语言:javascript
运行
复制
echo '\section{The title}' | sed -r 's/\\section\{([^}]+)\}/\\renewcommand{\\TITLE}{\1}\n\\section{\\TIT}/g' 

将产生以下结果:

代码语言:javascript
运行
复制
\renewcommand{\TITLE}{The title}
\section{\TIT}

转换状态(一个文件)

我们可以对状态应用非常类似的转换:

代码语言:javascript
运行
复制
sed -r 's/\\status\{([^}]+)\}/\\renewcommand{\\STATUS}{\1}\n\\STA/g'

这将改变:

代码语言:javascript
运行
复制
\status{Work in progress}

转入:

代码语言:javascript
运行
复制
\renewcommand{\STATUS}{Work in progress}
\STA

合并两者(一个文件)

现在,您可以很容易地将一个sed应用于给定的文件:

代码语言:javascript
运行
复制
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命令,使用findxargs来调用每个文件的命令:

代码语言:javascript
运行
复制
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

在尝试这样的转换之前,我会确保您备份(或版本控制)所有文件。只是为了确保你可以退回去以防出了什么问题。

我希望这能帮到你。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50087464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档