我正在尝试使用 sed/bash 制作一个简单的维基文本解析器。当我运行时
echo "London has [[public transport]]" | sed s/\\[\\[[A-Za-z0-9\ ]*\\]\\]/link/
它给了我伦敦有链接
但是当我尝试使用标记的子表达式来获取括号的内容时使用
sed s/\\[\\[\([A-Za-z0-9\ ]*\)\\]\\]/\1/
它只是给了我伦敦有[[公共(public)交通]]
最佳答案
那是因为正则表达式不匹配。
由于您没有将 sed 表达式括在引号中,因此您必须对 shell 进行双转义斜杠 - 这就是为什么您使用 \\[
而不是 \[
.
现在,在 sed 默认正则表达式(基本正则表达式)中,捕获括号由正则表达式中的 \(
和 \)
表示。由于您在 shell 中输入的内容没有用引号引起来,因此您需要转义反斜杠。由于 bash 解释括号,因此您也必须转义它们:
echo "London has [[public transport]]" | sed s/\\[\\[\\\([A-Za-z0-9\ ]*\\\)\\]\\]/\\1/
我强烈建议您只需将 sed 表达式括在单引号中,以便于编写:
echo "London has [[public transport]]" | sed 's/\[\[\([A-Za-z0-9\ ]*\)\]\]/\1/'
容易得多吧?
关于regex - Sed 子表达式未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9575980/