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 -E
或 awk
)或寻找其他方法来实现所需的匹配。
测试
测试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