sed 替换错误的斜杠

sed 替换错误的斜杠

我在 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:

这样做有两个问题:

  1. emph 之前的 '\' 放置在 LaTeX 转义字符之前。
  2. sed 似乎只会替换第一个匹配项。我知道 sed 中的贪婪匹配,这就是为什么我在花括号内使用 [az]* 而不是 .*。但这似乎不起作用。

关于如何让 sed 按照我的意愿行事有什么想法吗?

答案1

找到了。

由于 sed 命令中使用了双引号,因此我应该对 sed 和 bash 转义斜杠。改变单引号使得 bash 忽略转义,这是解决的第一个问题。

通过在 sed 命令末尾添加“g”(全球的替换)它现在匹配线路上的所有内容。

最终结果:

sed 's_\(\\emph{[a-z]*}\)_%\*\1\*)_g' 

相关内容