替换文本字符串并捕获中间的内容

替换文本字符串并捕获中间的内容

我正在编辑 LaTeX 文档,并且需要将 的所有实例更改\parallel something \parallel\norm{something}.有时,“\parallel”和“something”之间没有空格。我正在尝试使用

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt  $

但它返回“无效引用”的错误。正确的代码是什么sed

答案1

当你这样做时:

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt

,您没有使用捕获组。

[]在您指定的字符类中。字符类是几个可以用其中一个替换的符号。因此,RE 就像完全匹配或[.*]之一,而不是“任何字符序列”。.*

捕获组用 表示\(RE\)。因此,您应该替换[]\(\),如下所示:

$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm{\1}/g' a.txt

,您将能够通过 访问它\1

答案2

sed -i -e 's/\\parallel\s\+\(.*\S\)\s*\\parallel/\\norm {\1}/g' a.txt

\1替换字符串中的内容指的是搜索模式中的第一个\(...。\)

如果您更喜欢“扩展”正则表达式语法,那么

sed -i -r -e 's/\\parallel\s+(.*\S)\s*\\parallel/\\norm \{\1\}/g' a.txt

答案3

代替:

$ sed -i 's/\\parallel[.*]\\parallel/\\norm\{\1\}/g' a.txt $

有了这个:

$ sed -i 's/\\parallel\(.*\)\\parallel/\\norm\{\1\}/g' a.txt

那应该有效

答案4

我不知道什么所以我用了 [:alnum:]

sed -r 's#\\parallel[ ]*([[:alnum:]]+)[ ]*\\parallel#\\norm{\1}#g'

相关内容