用括号/方括号替换某些命令,同时保留内容(CLI)

用括号/方括号替换某些命令,同时保留内容(CLI)

我有一个plain text包含LaTeX类似命令的文件\hspace{5cm}。要将此文件转换为.odt我的一些自定义命令无法正确转换。所以我想自动查找和替换具体的命令,但保留括号的内容(这意味着我想保留大多数命令,只删除一些)。我知道我可以直接打开gedit并手动进行替换,但这是一个用于重复自动替换的脚本。

我已经搜索过这个问题,但到目前为止只找到了删除括号但保留内容的答案(参见这里,这里))。我还看了一些介绍sed(例如这里 或者这里),但没有成功。

例子:

This is my \textbf{text} where there are about \prc{5} commands, i.e. \mErrRange{30}{20}{m}.

因此,由于这些是百分比和错误范围,我想删除命令和花括号并得到如下内容(保留命令\textbf{...}):

This is my \textbf{text} where there are 5 % commands, i.e. 30 ± 20 m.

我到目前为止尝试过的:

有多种使用方式sed,例如:

sed -i -e 's/\\prc{\(.*\)}/\1%/g' hello.txt

这已经给了我:

This is my \textbf{text} where there are about 5} commands, i.e. \mErrRange{30}{20}{m%.

(替换行中的最后一个花括号,但保留另一个花括号。)

所以,现在我不知道该如何继续。也许我应该使用另一个工具而不是sed?!我很高兴任何建议可以在 Ubuntu 上运行,而无需terminal安装太多东西。

答案1

这里有一种方法:

sed 's/\\prc{\([^}]*\)}/\1 %/g'

这将捕获后面括号内的所有内容\prc并将其保存在组中1,您可以使用它将命令替换为括号的内容。[^}]*这里只取除右括号之外的所有内容。g代表“全局”,意味着它将替换行中出现的所有模式,而不仅仅是第一个——在您的案例中,您会希望每个表达式都这样做。

至于另一个,只需使用多个组:

sed 's/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g'

你可以随意组合这些表达式,但很容易让人产生误解。我建议编写一个sed脚本,每行一个表达式,如下所示:

#!/bin/sed -f
s/\\prc{\([^}]*\)}/\1 %/g
s/\\mErrRange{\([^}]*\)}{\([^}]*\)}{\([^}]*\)}/\1 ± \2 \3/g

将其另存为例如script.sed,使其可执行chmod +x /path/to/script.sed,然后运行它/path/to/script.sed

示例运行

$ /path/to/script.sed <hello.txt
This is my \textbf{text} where there are about 5 % commands, i.e. 30 ± 20 m.

我让 shell 尽可能频繁地打开输入文件,因此而<hello.txt不仅仅是hello.txt(这也有效!)。如果你对它到底有什么好处感兴趣,我建议unix.SE 上的这个答案

相关内容