我有一个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 上的这个答案。