sed默认正则表达式的+加号和?问号表示本身,要加\反斜杠才能表示 一多匹配:\+ 和 零一匹配:\?



默认正则用\+表示一多

echo aaaaaa | sed 's/a\+/BBBBBBBBBB/g'

扩展正则用+表示一多

echo aaaaaa | sed -E 's/a+/BBBBBBBBBB/g'




sed 的默认模式下,它使用的是 POSIX 基本正则表达式(BRE,Basic Regular Expressions)。在 POSIX 基本正则表达式中,+(加号)和 ?(问号)并不具备特殊的重复或可选匹配功能,它们仅仅被视为普通字符。

具体来说:

  • +:在基本正则表达式中,它并不代表重复一次或多次。如果你尝试在 sed 的默认模式下使用 + 来表示重复,它将不会按预期工作,因为 sed 会将其视为字面意义上的加号字符。

  • ?:同样地,在基本正则表达式中,它并不代表零次或一次匹配。在 sed 的默认模式下,? 也会被当作字面意义上的问号字符来处理。

要在 sed 中使用 +? 来表示重复和可选匹配,你需要切换到扩展正则表达式(ERE,Extended Regular Expressions)。在 GNU sed(Linux 上常见的 sed 版本)中,你可以通过添加 -E--regexp-extended 选项来启用扩展正则表达式。

例如,如果你想要匹配一个或多个 a 字符,在扩展正则表达式中你可以使用 a+,而在 sed 中启用扩展正则表达式后,你可以这样写:

sed -E 's/a+/replacement/' file

同样地,如果你想要匹配零个或一个 a 字符,在扩展正则表达式中你可以使用 a?,在 sed 中启用扩展正则表达式后,你可以这样写:

sed -E 's/a?/replacement/' file

请注意,如果你使用的是非 GNU 版本的 sed,可能需要检查该版本的文档以确定是否支持 -E 选项或其他方式来启用扩展正则表达式。如果不支持,你可能需要使用其他工具(如 grep -Eawk)或寻找其他方法来实现所需的匹配。

测试

测试1

root@103vm-ubt2441d:/etc/netplan# echo aaaaaa | sed 's/a+/BBBBBBBBBB/g'
aaaaaa
root@103vm-ubt2441d:/etc/netplan# echo aaaaaa | sed 's/a\+/BBBBBBBBBB/g'
BBBBBBBBBB
root@103vm-ubt2441d:/etc/netplan# echo aaaaaa | sed -E 's/a\+/BBBBBBBBBB/g'
aaaaaa
root@103vm-ubt2441d:/etc/netplan# echo aaaaaa | sed -E 's/a+/BBBBBBBBBB/g'
BBBBBBBBBB
11-23 07:38