sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面
前言
-r
等效 -E
, 启用扩展正则表达式
-E
是新叫法,更统一,能增强可移植性 , 但老系统,比如 CentOS-7 的 sed 只能用 -r
### Ubuntu24.04-E, -r, --regexp-extendeduse extended regular expressions in the script(for portability use POSIX -E).### CentOS7.9-r, --regexp-extended在脚本中使用扩展正则表达式### Fedora39-E, -r, --regexp-extended在脚本中使用扩展正则表达式(为保证可移植性使用 POSIX -E)。### Rocky Linux 9.1 (Blue Onyx) -E, -r, --regexp-extendeduse extended regular expressions in the script(for portability use POSIX -E).
-
sed在未开启扩展正则前, 使用
+
加号 和?
问号, 前面要加上反斜杠\
才能表示 一多(\+
) 和 零一(\?
)
在开启扩展正则后, 不用加反斜杠\
-
-i
是将结果保存到文件 -
新版本 r 和 E 可以都写上
-r
,-E
,-rE
,-Er
都可以
经测试, 如果将 -i
写在 -r
或-E
之前, 则扩展正则不会生效 , 如 -ir
, -iE
, irE
将 -r
或-E
写在 -i
之前, 如 -ri
, -Ei
, -Eri
-rEi
就能生效扩展正则
加上 e 可以写成 -Erie
, -rEie
在 CentOS-7.9 上的测试
[root@3050 ttt]# echo aaa > t
[root@3050 ttt]# cat t
aaa
[root@3050 ttt]# sed -ire 's/a+/bbbbbbbbbb/g' t
[root@3050 ttt]# cat t
aaa
[root@3050 ttt]# sed -rie 's/a+/bbbbbbbbbb/g' t
[root@3050 ttt]# cat t
bbbbbbbbbb
在 Ubuntu-24.04 上测试
root@TxCloud:~/ttt# echo aaa > t
root@TxCloud:~/ttt# ls
t
root@TxCloud:~/ttt# cat t
aaa
root@TxCloud:~/ttt# sed -ir 's/a+/bbbbbbbbb/g' t
root@TxCloud:~/ttt# cat t
aaa
root@TxCloud:~/ttt# sed -iE 's/a+/bbbbbbbbb/g' t
root@TxCloud:~/ttt# cat t
aaa
root@TxCloud:~/ttt# sed -iEr 's/a+/bbbbbbbbb/g' t
root@TxCloud:~/ttt# cat t
aaa
root@TxCloud:~/ttt# sed -Eri 's/a+/bbbbbbbbb/g' t
root@TxCloud:~/ttt# cat t
bbbbbbbbb
在 Rocky Linux 9.1 (Blue Onyx) 的测试
[root@u16slc ttt]# echo 111 > t
[root@u16slc ttt]# ls
t
[root@u16slc ttt]# cat t
111
[root@u16slc ttt]# sed -ir 's/1+//g' t
[root@u16slc ttt]# cat t
111
[root@u16slc ttt]# sed -iE 's/1+//g' t
[root@u16slc ttt]# cat t
111
[root@u16slc ttt]# sed -iEr 's/1+//g' t
[root@u16slc ttt]# cat t
111
[root@u16slc ttt]# sed -irE 's/1+//g' t
[root@u16slc ttt]# cat t
111
[root@u16slc ttt]# sed -rEi 's/1+//g' t
[root@u16slc ttt]# cat t[root@u16slc ttt]#
在 Fedora 40 上的测试
root@n1-40-2-6:~/ttt# echo 111 > t
root@n1-40-2-6:~/ttt# cat t
111
root@n1-40-2-6:~/ttt# sed -iE 's/1+/222222222222222222222222/g' t
root@n1-40-2-6:~/ttt# cat t
111
root@n1-40-2-6:~/ttt# sed -Ei 's/1+/222222222222222222222222/g' t
root@n1-40-2-6:~/ttt# cat t
222222222222222222222222
在 Rocky Linux 9.4 (Blue Onyx) 的测试
[root@103R94 ttt]# echo aaa > t
[root@103R94 ttt]# cat t
aaa
[root@103R94 ttt]# sed -irEe 's/a+/AAAAAAAAAAAA/g' t
[root@103R94 ttt]# cat t
aaa
[root@103R94 ttt]# sed -rEie 's/a+/AAAAAAAAAAAA/g' t
[root@103R94 ttt]# cat t
AAAAAAAAAAAA