我正在尝试使用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]]
答案 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
在我的机器上运行。
我希望这会有所帮助。