linux sed

 ̄綄美尐妖づ 提交于 2020-11-21 09:30:42

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 案例

  1. 在配置文件后追加配置: sed '$a \ access no \n operration no' test.txt // $代表: 最后一行。 第一个斜杠代表间隔符,要不紧跟的空格不起作用。

  2. 删除文本中的空行:sed '/^$/d' test.txt [root@iZryxshkbkz2x2Z ~]# sed '/^$/d' test.txt

3 s 替换

3-1

  1. 注意s 替换与c 的区别,c 是替换行的。

  2. 替换字符串 和被替换字符串 记得前后加 /.

    [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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!