sed匹配第N个进行替换

sed -s '/^c/{:a;n;s@/bin/bash@/sbin/nologin0@g;/^m/!ba}' passwd

[root@elk 13_bash]# cat passw
a:x:1002:1002::/home/a:/bin/bash
b:x:1003:1003::/home/b:/bin/bash
c:x:1004:1004::/home/c:/bin/bash
d:x:1005:1005::/home/d:/bin/bash
e:x:1006:1006::/home/e:/bin/bash
f:x:1007:1007::/home/f:/bin/bash
g:x:1008:1008::/home/g:/bin/bash
h:x:1009:1009::/home/h:/bin/bash
j:x:1010:1010::/home/j:/bin/bash
k:x:1011:1011::/home/k:/bin/bash
l:x:1012:1012::/home/l:/bin/bash
m:x:1013:1013::/home/m:/bin/bash
n:x:1014:1014::/home/n:/bin/bash
p:x:1015:1015::/home/p:/bin/bash
i:x:1016:1016::/home/i:/bin/bash
[root@elk 13_bash]# sed -si '/^c/{:a;n;s@/bin/bash@/sbin/nologin0@g;/^m/!ba}' passwd
a:x:1002:1002::/home/a:/bin/bash
b:x:1003:1003::/home/b:/bin/bash
c:x:1004:1004::/home/c:/bin/bash
d:x:1005:1005::/home/d:/sbin/nologin0
e:x:1006:1006::/home/e:/sbin/nologin0
f:x:1007:1007::/home/f:/sbin/nologin0
g:x:1008:1008::/home/g:/sbin/nologin0
h:x:1009:1009::/home/h:/sbin/nologin0
j:x:1010:1010::/home/j:/sbin/nologin0
k:x:1011:1011::/home/k:/sbin/nologin0
l:x:1012:1012::/home/l:/sbin/nologin0
m:x:1013:1013::/home/m:/sbin/nologin0
n:x:1014:1014::/home/n:/bin/bash
p:x:1015:1015::/home/p:/bin/bash
i:x:1016:1016::/home/i:/bin/bash

怎么匹配aaa~eee(开始结束字符串确定),然后替换123这样的
先匹配aaa,匹配到后执行大括号里的语句。
n 读取下一行
s/123/xyz/g 将123替换为xyz,全局替换,同一行中出现几次替换几次
:a 设定跳转标签a
/eee/!ba 若当前行匹配不上eee,则跳转到标签a处继续执行,构成一个循环。若匹配到eee,则退出循环,sed重新对读入的每行匹配aaa。
由于sed没有加-n静默选项,所以默认对每行数据处理后都打印。
其中:a和!ba中的a是可以随意改变的,其中的b是不可改变的.

猜你喜欢

转载自blog.51cto.com/chier11/2325912