1 sed -p
打印文本: sed -n 'p' test.txt 如果不加-n,则每行都重复。
定位一行:
[root@iZryxshkbkz2x2Z ~]# sed -n '5p' test.txt
ddddddd root dafdadf
也可以用正则匹配(使用正则时一定要用// 把正则表达式包裹起来):
root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '/\(ddddddddd\)\+/p'
dddddddddddrootfdaxcmkadfakdsmflakd
定位多行:
root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '2,4p'
2 dddddddddddrootfdaxcmkadfakdsmflakd
3 testfkdlkfaldkfl;akccccccccccccccccdadfac
4 fdafacdfadsssssssssfdasfasfroot
用正则实现:不知道为啥不行,明天看看
取反:使用!
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '2,4!p'
1 root 122222222222 dddddddaaa
5 ddddddd root dafdadf
行间隔: first~step : 错误理解: 从first 行开始跳过step-1 行
重点: 看结果理解。
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '1~2p' # c
1 root 122222222222 dddddddaaa
3 testfkdlkfaldkfl;akccccccccccccccccdadfac
5 ddddddd root dafdadf
2 sed 行处理命令
2-1 -a (新增行,而不是在后面追加)
在第一行和第二行后添加 '======='
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '1,2a=========='
1 root 122222222222 dddddddaaa
==========
2 dddddddddddrootfdaxcmkadfakdsmflakd
==========
3 testfkdlkfaldkfl;akccccccccccccccccdadfac
4 fdafacdfadsssssssssfdasfasfroot
5 ddddddd root dafdadf
2-2 -i(在xx行开头插入一行)
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2i==========' # 在第二行开头插入===,相当于1a====
1 root 122222222222 dddddddaaa
==========
2 dddddddddddrootfdaxcmkadfakdsmflakd
3 testfkdlkfaldkfl;akccccccccccccccccdadfac
4 fdafacdfadsssssssssfdasfasfroot
5 ddddddd root dafdadf
2-3 -c 替代行
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2c======' # 用 ======= 替代第二行
1 root 122222222222 dddddddaaa
======
3 testfkdlkfaldkfl;akccccccccccccccccdadfac
4 fdafacdfadsssssssssfdasfasfroot
5 ddddddd root da
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2,4c======' # 替换多行
1 root 122222222222 dddddddaaa
======
5 ddddddd root dafdadf
2-4 -d 删除行
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed '2d'
1 root 122222222222 dddddddaaa
3 testfkdlkfaldkfl;akccccccccccccccccdadfac
4 fdafacdfadsssssssssfdasfasfroot
5 ddddddd root dafdadf
2-5 案例
-
在配置文件后追加配置: sed '$a \ access no \n operration no' test.txt // $代表: 最后一行。 第一个斜杠代表间隔符,要不紧跟的空格不起作用。
-
删除文本中的空行:sed '/^$/d' test.txt [root@iZryxshkbkz2x2Z ~]# sed '/^$/d' test.txt
3 s 替换
3-1
-
注意s 替换与c 的区别,c 是替换行的。
-
替换字符串 和被替换字符串 记得前后加 /.
[root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/' test.txt root2 122222222222 dddddddaaa dddddddddddroot2fdaxcmkadfakdsmflakd testfkdlkfaldkfl;akccccccccccccccccdadfac fdafacdfadsssssssssfdasfasfroot2 ddddddd root2 dafdadf
3-2 -g(全局替换)
g 参数代表全局参数,如果不加g 则只替换每一行的第一个匹配的。
[root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/' test.txt
root2 rootaaaa2222222 dddddddaaa
fdafacdfadsssssssssfdasfasfroot2
root2dddddddrootdafdadfroot
[root@iZryxshkbkz2x2Z ~]# sed 's/root/root2/g' test.txt
root2 root2aaaa2222222 dddddddaaa
fdafacdfadsssssssssfdasfasfroot2
root2dddddddroot2dafdadfroot2
sed高级操作
一 第一节
1 {} : 多个sed 命令
场景: 实现间隔行(还可以用first~step 实现): nl test.txt | sed -n '{n;p}':
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '{n;p}'
2 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
4 bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
6 ccccccccccccccccccccccccccccccc
nl test.txt | sed -n '{p;n}':
[root@iZryxshkbkz2x2Z ~]# nl test.txt | sed -n '{p;n}'
1 root rootaaaa2222222 dddddddaaa
3 fdafacdfadsssssssssfdasfasfroot
5 rootdddddddrootdafdadfroot
7 dddddddddddddddddddddddddd
2 -&:替换固定字符串
比如: sed '/root/&3/s' test.tet 等价于 sed 's/root/root3/' test.txt
[root@iZryxshkbkz2x2Z ~]# sed 's/root/&3/g' test.txt # 等价于 sed 's/root/root3/g' test.txt
root3 root3aaaa2222222 dddddddaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
fdafacdfadsssssssssfdasfasfroot3
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
root3dddddddroot3dafdadfroot3
ccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddd
案例1: 在root 后添加冒号:
sed 's/root/& : /g' test.txt:
[root@iZryxshkbkz2x2Z ~]# sed 's/root/& : /g' test.txt
root : root : aaaa2222222 dddddddaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
fdafacdfadsssssssssfdasfasfroot :
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
root : dddddddroot : dafdadfroot :
ccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddd
案例二: 将root 首字母转为大写:
sed 's/root/\u&/g' test.txt
[root@iZryxshkbkz2x2Z ~]# sed 's/root/\u&/g' test.txt
Root Rootaaaa2222222 dddddddaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
fdafacdfadsssssssssfdasfasfRoot
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
RootdddddddRootdafdadfRoot
ccccccccccccccccccccccccccccccc
dddddddddddddddddddddddddd
案例三: 将txt文件首字母转换为大写:
ls *.txt | sed 's/\w+/\u&/'
[root@iZryxshkbkz2x2Z ~]# ls *.txt | sed 's/\w\+/\u&/'
Ip.txt
Test.txt
3 括号的使用
案例1: 提取passwd 中的用户名,UID,GROUPID:
注意: .* :懒惰匹配
[root@iZryxshkbkz2x2Z ~]# sed 's/\(^[a-z_-]\+\):x:\([0-9]\+\):\([0-9]\+\).*$/ \1 \2 \3/ ' passwd
root 0 0
bin 1 1
daemon 2 2
adm 3 4
lp 4 7
sync 5 0
shutdown 6 0
halt 7 0
.* :懒惰匹配 \1 \2 \3 : 匹配的内容
** 案例2 **
提取ifconfig eth0 中的第二行
[root@iZryxshkbkz2x2Z ~]# ifconfig eth0 | sed -n '/inet/p' |sed 's/ine.r:([0-9.]+) .$/\1/'
4 读(r) 和 写(w)
把abc 的内容写入 123.txt 内容的第一行。(abc.txt 和 123.txt 本身并没有变化)
[root@iZryxshkbkz2x2Z ~]# sed '1r abc.txt' 123.txt
1111111111111
aaaaaaa
bbbbbbbbbbbbbbb
cccccccccccccc
222222222222
33333333333333
把 123.txt 第一行的内容写入abc.txt
[root@iZryxshkbkz2x2Z ~]# sed '1w abc.txt' 123.txt
5 q: 退出sed
来源:oschina
链接:https://my.oschina.net/u/2930993/blog/1922541