sed:转义的方括号不匹配

sed:转义的方括号不匹配

目标:替换![alttext](url.png)<img src="url.png" alt="alttext">.

!和部分(...)工作正常,这是[...]我无法工作的部分。

举一个简单的例子,我想匹配输入a [test] b。这是我使用的命令:

echo 'a [test] b' | sed 's/\[[^\]]*\]/x/'

这不起作用。当我用尖括号替换方括号时,它工作得很好:

echo 'a <test> b' | sed 's/<[^>]*>/x/'

为什么 sed 不理解相同的正则表达式但带有转义的方括号?它在其他工具(例如 Python)中运行良好。

答案1

在字符类定义中,]当直接跟在 之后时,它将按字面意思执行^。所以不要逃避这一点。此外,您还缺少一个量词,如+,来表示“一个或多个字符”或*“零个或多个字符”。此外,您的命令行中还有一个sed太多。

$ echo 'a [test] b' | sed 's/\[[^]]\+\]/x/'
a x b

\+作为 GNU 扩展(现在也受到一些其他实现的支持),标准等效项是\{1,\}

或更易读:

$ echo 'a [test] b' | sed -E 's:\[[^]]+\]:x:'
a x b

-E作为 BSD 扩展,现在也受 GNUsed和其他一些实现的支持;-r在旧版本的 GNU 中使用sed)。

相关内容