Sed子表达式没有按预期工作

时间:2012-03-05 23:56:59

标签: regex sed

我正在尝试使用sed / bash创建一个简单的wiki文本解析器。我跑的时候

echo "London has [[public transport]]" | sed s/\\[\\[[A-Za-z0-9\ ]*\\]\\]/link/

它给了我London has link 但是当我尝试使用标记的子表达式来获取括号的内容时使用

sed s/\\[\\[\([A-Za-z0-9\ ]*\)\\]\\]/\1/

它只是给了我London has [[public transport]]

2 个答案:

答案 0 :(得分:2)

那是因为正则表达式不匹配。

由于你没有在引号中包含你的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/'

更容易吧?

答案 1 :(得分:0)

echo "London has [[public transport]]" | sed 's@[[][[]\([A-Za-z0-9\ ]*\)[]][]]@\1@'

<强>输出

London has public transport

在我的机器上运行。

我希望这会有所帮助。