Bootstrap

sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面

sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面

前言

-r 等效 -E , 启用扩展正则表达式

-E是新叫法,更统一,能增强可移植性 , 但老系统,比如 CentOS-7 的 sed 只能用 -r

###  Ubuntu24.04
  -E, -r, --regexp-extended
                 use 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-extended
                 use extended regular expressions in the script
                 (for portability use POSIX -E).

  1. sed在未开启扩展正则前, 使用+加号 和 ?问号, 前面要加上反斜杠\ 才能表示 一多(\+) 和 零一(\?)
    在开启扩展正则后, 不用加反斜杠\

  2. -i 是将结果保存到文件

  3. 新版本 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
;