Linux sed命令介绍

sed:

sed会根据脚本命令来处理文本文件中的数据。
sed命令每次读取一行
sed命令默认不会修改源文件
sed命令默认会将结果输出到标准输出

sed默认语法:

sed [-nhVi] [-e ‘script’] [-f ‘script’] [文本文件]

sed有如下参数:

  1. -e:指定后面的是命令,用’'包括
  2. -f:从文件读取命令
  3. -n:不输出到控制台
  4. -i:会修改源文件
  5. -h:显示帮助
  6. -V:显示版本

在sed的脚本命令中,有如下动作:

  • a:在新行新增字符串
  • c:取代指定行的字符串
  • d:删除指定字符串
  • i :插入指定字符串
  • p:打印指定字符串
  • s:取代指定字符串
  • y: 单个字符一一转换
  • w:写入文件
  • r : 读取文件
  • q:第一次匹配结束后退出sed命令

接下来分别介绍各个动作:

	a:
		#语法:[address]a\content
		sed '3a\this is a new line' data.txt
			#在data.txt第3行后添加新行this is a new line
			3 表示第三行,a 表示增加(下面),\表示换行,this is a new line 表示新增的内容,data.txt表示操作的文件
		sed '3a\this is a new line\nthis is a second line' data.txt 
			#在data.txt第3行后添加新2行this is a new line 和 this is a second line
	i:	
		#语法:[address]i\content
		sed '3i\this is a new line' data.txt 
			#在data.txt第3行前添加新行this is a new line
			3 表示第三行,i 表示增加(上面),\表示换行,this is a new line 表示新增的内容,data.txt表示操作的文件
	s:
		#语法:[address]s/pattern/replacement/flags
		address表示操作的行,pattern指定需要替换的内容,replacement指定替换的新内容。
		address可以为:
			1. 为数字n,表示操作第n行
			2. 为数字范围n,m,表示操作n~m行
			3. 为数字范围n,$,表示操作n行到最后一行
			4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
		flags标记:
			1. 为1-512之间的数字,表示要pattern出现第几次时替换
			2. 为g,表示所有匹配的内容都替换
			3. 为p,打印与pattern匹配的行,一般与-n选项一起配合使用
			4. 为w file,将输出结构写入到file文件中
			5. 为&,表示用正则表达式匹配替换
			6. 为\n,匹配第n个子串
			7. 为\, 转义字符
			
		sed 's/old/new/2' data.txt
			#将data.txt的每一行第2次出现的old替换成new
			s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,2表示每一行第2次出现时,data.txt表示操作的文件
		sed 's/old/new/g' data.txt
			#将data.txt的所有出现的old替换成new
			s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,data.txt表示操作的文件
		sed 's/old/new/w tmp.txt' data.txt
			#将data.txt中被替换过的行写入到tmp.txt,注意w前未有其他标记,故每一行只会替换第一次出现的old
			s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,w tmp.txt表示写入到tmp.txt文件,data.txt表示操作的文件
		sed 's/old/new/g w tmp.txt' data.txt
			#将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
			s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt表示写入到tmp.txt文件,data.txt表示操作的文件
		sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
			#将/etc/passwd文件中的每一行的第一次匹配的/bin/bash替换成/bin/csh,注意对/符号要做转义\
			s 表示替换动作,\/转义字符'/''/bin/bash'做转义操作为'\/bin\/bash'
		sed '2s/old/new/g w tmp.txt' data.txt
			#操作第2行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
			2 表示要操作的行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
		表示写入到tmp.txt文件,data.txt表示操作的文件		
		sed '2,5s/old/new/g w tmp.txt' data.txt
			#操作第2行到5行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
			2,5 表示要操作的行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
		表示写入到tmp.txt文件,data.txt表示操作的文件	
		sed '2,$s/old/new/g w tmp.txt' data.txt
			#操作第2行到最后一行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
			2,$ 表示要操作的行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
		表示写入到tmp.txt文件,data.txt表示操作的文件
		sed '/root/s/old/new/g w tmp.txt' data.txt
			#操作匹配root表达式的每一行,将data.txt中被替换过的行写入到tmp.txt,注意有g标记,表示每一行所有匹配的old都替换成new
			/root/ 表示匹配root表达式的每一行,s 表示替换动作,old表示匹配的字符串,new表示替换的字符串,g表示所有匹配,w tmp.txt
		表示写入到tmp.txt文件,data.txt表示操作的文件
	d:
		#语法:[address]d
		address可以为:
			1. 为数字n,表示操作第n行
			2. 为数字范围n,m,表示操作n~m行
			3. 为数字范围n,$,表示操作n行到最后一行
			4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
		sed '2d' data.txt
			#删除data.txt中第2行
			2 表示操作第2行,d表示删除,data.txt表示操作的文件
		sed '2,3d' data.txt
			#删除data.txt中2~3行
			2,3 表示操作第2~3行,d表示删除,data.txt表示操作的文件
		sed '2,$d' data.txt
			#删除data.txt中第2行到最后一行
			2,$表示操作第2行到最后一行,d表示删除,data.txt表示操作的文件
		sed '/old/d' data.txt
			#删除data.txt中匹配old表达式的每一行
			/old/表示操作匹配old表达式的每一行,d表示删除,data.txt表示操作的文件
	c:
		#语法:[address]c\replacement
		address可以为:
			1. 为数字n,表示操作第n行
			2. 为数字范围n,m,表示操作n~m行
			3. 为数字范围n,$,表示操作n行到最后一行
			4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
		sed '3c\this is a replacement' data.txt
			#将data.txt的第3行替换成this is a replacement
			3 表示操作第3行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
		sed '2,3c\this is a replacement' data.txt
			#将data.txt的第2~3行替换成this is a replacement,注意是2~3行所有内容一次性替换
			2,3表示操作第2~3行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
		sed '2,$c\this is a replacement' data.txt
			#将data.txt的第2行到最后一行替换成this is a replacement,注意是第2行到最后一行所有内容一次性替换
			2,$ 表示操作第2行到最后一行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
		sed '/old/c\this is a replacement' data.txt
			#将data.txt的匹配old的每一行替换成this is a replacement
			/old/ 表示匹配old表达式的每一行,c表示替换动作,this is a replacement表示要替换的新内容,data.txt表示操作的文件
	y:
		#语法:[address]y/inchars/outchars/
		address可以为:
			1. 为数字n,表示操作第n行
			2. 为数字范围n,m,表示操作n~m行
			3. 为数字范围n,$,表示操作n行到最后一行
			4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
		sed 'y/123/789/' data.txt
			#将data.txt中的每一行的所有的1转换成7,2转换成8,3转换成9
		sed '2,3y/123/789/' data.txt
			#将data.txt中的2~3行的所有的1转换成7,2转换成8,3转换成9
		sed '/old/y/123/789/' data.txt
			#将data.txt中的匹配old的每一行的所有的1转换成7,2转换成8,3转换成9
	p:		
		#语法:[address]p
		address可以为:
			1. 为数字n,表示操作第n行
			2. 为数字范围n,m,表示操作n~m行
			3. 为数字范围n,$,表示操作n行到最后一行
			4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
		一般与-n选项一起使用
		sed -n 'p' data.txt
			#显示data.txt所有内容
			-n 表示不输出到控制台,p表示打印缓存,data.txt表示操作的文件
		sed -n '2p' data.txt
			#显示data.txt第2行内容
			-n 表示不输出到控制台,2表示第2行,p表示打印缓存,data.txt表示操作的文件
		sed -n '2,3p' data.txt
			#显示data.txt第2~3行内容
			-n 表示不输出到控制台,2,3表示第2~3行,p表示打印缓存,data.txt表示操作的文件
		sed -n '/old/p' data.txt
			#显示data.txt匹配表达式old的每一行
			-n 表示不输出到控制台,/old/表示匹配old的每一行,p表示打印缓存,data.txt表示操作的文件
	w:
		#语法:[address]w filename
		address可以为:
			1. 为数字n,表示操作第n行
			2. 为数字范围n,m,表示操作n~m行
			3. 为数字范围n,$,表示操作n行到最后一行
			4. 为表达式/pattern/,表示操作与表达式pattern匹配的每一行
		sed '2w tmp.txt' data.txt
			#将data.txt的第2行写入到tmp.txt文件中
			2 表示要操作第2行,w表示写文件动作,tmp.txt表示写入的文件名,data.txt表示操作的文件
		sed '2,3w tmp.txt' data.txt
			#将data.txt的第2~3行内容写入到tmp.txt文件中
			2,3 表示第2~3行,w表示写文件动作,tmp.txt表示写入的文件名,data.txt表示操作的文件
		sed '/old/w tmp.txt' data.txt
			#将data.txt的匹配表达式old的每一行写入到tmp.txt文件中
			/old/表示匹配old的每一行,w表示写文件动作,tmp.txt表示写入的文件名,data.txt表示操作的文件
	r:
		#语法:[address]r filename
		address可以为:
			1. 为数字n,表示在第n行后操作
		sed '2r tmp.txt' data.txt
			#读取tmp.txt文件内容并插入到data.txt的第2行后面
			2 表示在第2行后,r表示读文件动作,tmp.txt表示读取的文件名,data.txt表示操作的文件
		sed '$r tmp.txt' data.txt
			#读取tmp.txt文件内容并插入到data.txt的文件末尾
			$ 表示在文件末尾,r表示读文件动作,tmp.txt表示读取的文件名,data.txt表示操作的文件
	q:
		sed -n '/root/{s/old/new/;p;q}' data.txt
			#对data.txt中第一个匹配root表达式的行,将old替换成new,然后打印并退出
			root表示与root表达式匹配的行,{}表示一组命令,命令用分号隔开,s/old/new/表示将一行
		中第一个old替换成new,p表示打印缓存,q退出sed命令,data.txt表示操作的文件
		
[root@localhost lgsh]# cat data.txt 
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# sed '3a\this is a new line' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
this is a new line
line 4. file end

[root@localhost lgsh]# sed '3a\this is a new line\nthis is a second line' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
this is a new line
this is a second line
line 4. file end

[root@localhost lgsh]# sed '3i\this is a new line' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
this is a new line
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# sed 's/old/new/2' data.txt
line 1. old new old new new new 111222333-root
line 2. old new old new new new 222-root
line 3. old new old new new new 333-admin
line 4. file end

[root@localhost lgsh]# sed 's/old/new/g' data.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end

[root@localhost lgsh]# sed 's/old/new/w tmp.txt' data.txt
line 1. new old old new new new 111222333-root
line 2. new old old new new new 222-root
line 3. new old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt
line 1. new old old new new new 111222333-root
line 2. new old old new new new 222-root
line 3. new old old new new new 333-admin

[root@localhost lgsh]# sed 's/old/new/g w tmp.txt' data.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin

[root@localhost lgsh]# sed -n '1s/\/bin\/bash/\/bin\/csh/p' /etc/passwd
root:x:0:0:root:/root:/bin/csh

[root@localhost lgsh]# sed '2s/old/new/g w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. new new new new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt 
line 2. new new new new new new 222-root

[root@localhost lgsh]# sed '2,5s/old/new/g w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt 
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin

[root@localhost lgsh]# sed '2,$s/old/new/g w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt 
line 2. new new new new new new 222-root
line 3. new new new new new new 333-admin

[root@localhost lgsh]# sed '/root/s/old/new/g w tmp.txt' data.txt
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt 
line 1. new new new new new new 111222333-root
line 2. new new new new new new 222-root

[root@localhost lgsh]# sed '2d' data.txt
line 1. old old old new new new 111222333-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# sed '2,3d' data.txt
line 1. old old old new new new 111222333-root
line 4. file end

[root@localhost lgsh]# sed '2,$d' data.txt
line 1. old old old new new new 111222333-root

[root@localhost lgsh]# sed '/old/d' data.txt
line 4. file end

[root@localhost lgsh]# sed '3c\this is a replacement' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
this is a replacement
line 4. file end

[root@localhost lgsh]# sed '2,3c\this is a replacement' data.txt
line 1. old old old new new new 111222333-root
this is a replacement
line 4. file end

[root@localhost lgsh]# sed '2,$c\this is a replacement' data.txt
line 1. old old old new new new 111222333-root
this is a replacement

[root@localhost lgsh]# sed '/old/c\this is a replacement' data.txt
this is a replacement
this is a replacement
this is a replacement
line 4. file end

[root@localhost lgsh]# sed 'y/123/789/' data.txt
line 7. old old old new new new 777888999-root
line 8. old old old new new new 888-root
line 9. old old old new new new 999-admin
line 4. file end

[root@localhost lgsh]# sed '2,3y/123/789/' data.txt
line 1. old old old new new new 111222333-root
line 8. old old old new new new 888-root
line 9. old old old new new new 999-admin
line 4. file end

[root@localhost lgsh]# sed '/old/y/123/789/' data.txt
line 7. old old old new new new 777888999-root
line 8. old old old new new new 888-root
line 9. old old old new new new 999-admin
line 4. file end

[root@localhost lgsh]# sed -n 'p' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# sed -n '2p' data.txt
line 2. old old old new new new 222-root

[root@localhost lgsh]# sed -n '2,3p' data.txt
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin

[root@localhost lgsh]# sed -n '/old/p' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin

[root@localhost lgsh]# sed '2w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt 
line 2. old old old new new new 222-root

[root@localhost lgsh]# sed '2,3w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt 
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin

[root@localhost lgsh]# sed '/old/w tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# cat tmp.txt 
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin

[root@localhost lgsh]# sed '2r tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 3. old old old new new new 333-admin
line 4. file end

[root@localhost lgsh]# sed '$r tmp.txt' data.txt
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin
line 4. file end
line 1. old old old new new new 111222333-root
line 2. old old old new new new 222-root
line 3. old old old new new new 333-admin

[root@localhost lgsh]# sed -n '/root/{s/old/new/;p;q}' data.txt
line 1. new old old new new new 111222333-root

[root@localhost lgsh]# 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值