bash - 使用 sed 在所有方程编号周围添加括号

标签 bash sed replace

我有一个很大的 LaTeX 文件,其中包含大量方程式。 它们都引用如下:

Equation~\ref{XX}
Equation~\ref{XY}
...

我想得到这个,

Equation~(\ref{XX})
Equation~(\ref{XY})
...

我只有 sed 的基本知识,但我相信它可以使用“&”符号来解决问题。

我试过:

sed 's#\ref{*}#(&)#g' input_tex_file.tex

这不会改变任何东西。

如果我这样做:

sed 's#\ref{XX}#(&)#g' input_tex_file.tex

我显然得到了

Equation~(\ref{XX})

但我想避免编写一个脚本来检测所有引用并按顺序修改它们,即使我猜它不会让人不知所措。

另请注意,我有很多东西,例如 Table~\ref{XX}Figure~\ref{XX} 我想保持不变。

有什么想法吗?

最佳答案

替换模式中的&符号代表整个匹配。您似乎想避免在除 Equation~ 之外的任何单词之后修改值,因此它应该包含在模式中,这意味着您不能使用 &,但可以使用常规 \1\2 来引用正则表达式的捕获部分。

您可以将 Equation~ 和模式的其余部分捕获到两个单独的组中,并在替换中引用它们:

sed 's#\(Equation~\)\(\\ref{[^{}]*}\)#\1(\2)#g'

或者,使用 POSIX ERE,

sed -E 's#(Equation~)(\\ref\{[^{}]*})#\1(\2)#g'

Demo :

s='Equation~\ref{XX} Table~\ref{XX} and Figure~\ref{XX}'
echo "$s" | sed 's#\(Equation~\)\(\\ref{[^{}]*}\)#\1(\2)#g'
# => Equation~(\ref{XX}) Table~\ref{XX} and Figure~\ref{XX}

关于bash - 使用 sed 在所有方程编号周围添加括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50814529/

相关文章:

linux - sed 用引号替换字符串

python - 根据索引合并两个数据框,替换其他列中的匹配值

mysql - SELECT MySQL中Catalog的唯一产品信息

bash - 从 wp-config.php 读取变量

mysql - bash 脚本中 grep 和 mysql 的变量

bash - 在 bash 脚本中使用变量名进行编译

linux - 使用sed替换特定的IP地址?

linux - 如何比较两个目录以更新 BASH 中的日志文件?

bash - 在行末添加 sed

javascript - 在两个 ul 中包装/拆分列表项