1

我有一段文字,我想取消嵌套。

\caption[Server HTTP responses]{Server HTTP responses\label{fig:http-status}}

我想 sed 碰撞最后的 } 以便它在标签前面开始,如下所示:

\caption[Server HTTP responses]{Server HTTP responses}\label{fig:http-status}

对我的测试文本使用正则表达式编辑器,似乎:

(\\label\{fig:[a-zA-z0-9 -]{1,}\})\}$

替换为

\}\1

会成功的。这适用于 debuggex.com 和 Mozilla 正则表达式测试器。

然而,当我用 sed 测试它时(我是 sed 的新手,所以请在这里放轻松),我使用

cat ./file.tex | sed -e 's@(\\label\{fig\:[a-zA-z0-9 -]{1,}\})\}$@\}\1@g' > test_output.txt

返回: sed: -e expression #1, char 47: Invalid content of \{\}

我在这里做错了什么?是否有更简单的方法来运行大量文本文件以替换正则表达式?

4

1 回答 1

2

你有一些问题:

  1. 花括号并不特殊,不要逃避它们以获得其字面意义。
  2. 与括号相同,不转义匹配文字,将它们转义以进行分组。
  3. 冒号并不特殊,不要逃避它们。
  4. 范围A-z不正确。
  5. /g标志不需要替换一次。

它得到:

sed -e 's@\(\\label{fig:[a-zA-Z0-9 -]\{1,\}}\)}$@}\1@' ./file.tex

这会产生:

\caption[Server HTTP responses]{Server HTTP responses}\label{fig:http-status}
于 2013-09-10T13:37:08.643 回答