regex - Sed 子表达式未按预期工作

标签 regex sed

我正在尝试使用 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/

相关文章:

Bash 脚本中的正则表达式

regex - 替换两个字符串之间的多次出现

iOS - NSString 正则表达式匹配

bash - 当传递给 sed 或 awk 时,冗长的管道命令输出挂起

c++ - boost 正则表达式捕获

javascript - 如何获取属性值的一部分?

linux - 仅当行号以 + csv 文件开头时才替换行中的单词

linux - 删除shell中以某个字符开头的行

linux - 使用 awk 或 sed 从多个文件中消除重复行

bash - 了解 docker 入口点脚本