![替换文本字符串并捕获中间的内容](https://linux22.com/image/99343/%E6%9B%BF%E6%8D%A2%E6%96%87%E6%9C%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E6%8D%95%E8%8E%B7%E4%B8%AD%E9%97%B4%E7%9A%84%E5%86%85%E5%AE%B9.png)
我正在编辑 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'