我在 LaTeX 文件中有以下代码:
for \emph{service} in \emph{host}.resources:
for \emph{file} in \emph{host}.resources:
\underline{service}.requires.add(\underline{file})
for \emph{package} in \emph{host}.resources:
\underline{service}.requires.add(\underline{package})
因为这是在列表环境中,并且我仍然想要 emph 和 underline 命令,所以我转义了 LaTeX 命令,结果如下:
for %*\emph{file}*) in %*\emph{host}*).resources:
我尝试使用以下 sed 命令自动执行此过程:
sed "s_\(\\emph{[a-z]*}\)_%\*\1\*)_"
但这会产生以下输出:
for \%*emph{dir}*) in \emph{host}.resources:
这样做有两个问题:
- emph 之前的 '\' 放置在 LaTeX 转义字符之前。
- sed 似乎只会替换第一个匹配项。我知道 sed 中的贪婪匹配,这就是为什么我在花括号内使用 [az]* 而不是 .*。但这似乎不起作用。
关于如何让 sed 按照我的意愿行事有什么想法吗?
答案1
找到了。
由于 sed 命令中使用了双引号,因此我应该对 sed 和 bash 转义斜杠。改变单引号使得 bash 忽略转义,这是解决的第一个问题。
通过在 sed 命令末尾添加“g”(全球的替换)它现在匹配线路上的所有内容。
最终结果:
sed 's_\(\\emph{[a-z]*}\)_%\*\1\*)_g'