linux 用于替换结构化文档中的文本的Bash脚本

v1l68za4  于 2022-12-03  发布在  Linux
关注(0)|答案(2)|浏览(150)

我有一个名为a.tex的.tex文件,其中包含许多行文本,如下例所示:

\begin{pycode}

Some text right here, let's say Text 1A: like: There are #cat and #dog.

\end{pycode}

Some text right here, let's say Text 1B: like: One day the #dog tried to run away.

\begin{pycode}

Some text right here, let's say Text 2A: like: There are #cat and #dog and #pig.

\end{pycode}

Some text right here, let's say Text 2B: like: There is #something here.

我想用“提到的文本的编号”替换任何#,例如,句子“有#猫和#狗。”应改为“这是一只1dog和1cat。”,因为它在课文1A中。而“有一天#狗试图逃跑。”应改为“有一天1dog试图逃跑。”而“有#猫和#狗和#Pig。”应改为“有两只猫、两只狗和两只Pig等等。
输出为.tex文件,此更改应用于整个文档。
所以我要的是:

\begin{pycode}

Some text right here, let's say Text 1A: like: There are 1cat and 1dog.

\end{pycode}

Some text right here, let's say Text 1B: like: One day the 1dog tried to run away.

\begin{pycode}

Some text right here, let's say Text 2A: like: There are 2cat and 2dog and 2pig.

\end{pycode}

Some text right here, let's say Text 2B: like: There is 2something here.

我的想法是从第一行开始搜索和替换。例如,如果我们看到“开始{pycode}”,那么s = s+1(对于某个计数变量s),然后搜索#,然后用s替换它,直到我们遇到下一个“begin{pycode}"。
我正在以这种方式寻找解决方案,但仍然需要时间来找到解决方案。
谢谢你的帮助。

f1tvaqid

f1tvaqid1#

$ awk '/\\begin[{]pycode}/{s++} {gsub(/#/,s); print}' a.tex
\begin{pycode}

Some text right here, let's say Text 1A: like: There are 1cat and 1dog.

\end{pycode}

Some text right here, let's say Text 1B: like: One day the 1dog tried to run away.

\begin{pycode}

Some text right here, let's say Text 2A: like: There are 2cat and 2dog and 2pig.

\end{pycode}

Some text right here, let's say Text 2B: like: There is 2something here.
hc8w905p

hc8w905p2#

您可以像这样使用'sed'命令:

sed -e 's/searchFor/replaceWith/g' filename

在您的情况下:

sed -e 's/#/'$i'/g' a.tex > output.tex

它所做的是在一个.tex文件中找到所有出现的'#'字符串,用$i的值替换它们,并将它们保存到输出.tex文件中。如果你想读取并保存到同一个文件中,只需用途:

sed -i 's/#/'$i'/g' a.tex

您可以在此处阅读有关“sed”命令的更多信息:Linux sed command

相关问题