shell文本处理三剑客之sed详解

文本处理:sed(Stream EDitor:流编辑)

sed 是一种在线的、非交互式的编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;

格式:

1 sed   选项  命令 文件 
	sed [options] 'command' file(s)
2 sed     选项 –f 脚本 文件
	sed [options] -f scriptfile file(s)
	-可以把想替换的写成一个脚本  这样可以替换多次

sed和正则表达式

与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。
正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。

使用基本元字符集	^, $, ., *, [], [^], \< \>,\(\),\{
     \}
使用扩展元字符集	?, +, |, ( )
使用扩展元字符的方式:
	\+           转义
	sed -r      加-r

sed 的选项

-r 参数不会修改内容,支持正则表达式。
-i 直接修改内容

sed 的命令

删除命令: d

sed -r '/root/d' passwd  	匹配词组删除
sed -r '3d' passwd          通过行号删除
sed -r '3{d}' passwd 		和上面的一样这个{
      }可以省略
sed -r '3{d;}' passwd  		{
     存放sed的多个命令} 3{
     h;d},h暂存空间
sed -r '3,$d' passwd		删除3到最后一行
sed -r '$d' passwd			只把最后一行删除了

替换命令: s

sed -r 's/root/aofa/' passwd 			 把root换成aofa
sed -r 's/root/aofa/g' passwd  			 默认之换每一行的第一个
sed -r 's/^root/aofa/' passwd   		 以root开始的词组,替换成aofa
sed -r 's/[0-9][0-9]$/&.5/' passwd 
										查找双数   结尾的词组
										&:替换成    双数.5
										&有查询结果的含义。
										
sed -r 's/(mail)/E\1/g' passwd			()括号组合字符,\1调用括号
								 		
sed -r 's#(mail)#E\1#g' passwd			分隔符可以换成井号


读文件命令:r

sed -r '$r 1.txt' passwd			在最后一行,读取插入新文件1.txt

sed -r '/root/r 1.txt' passwd		正则搜寻root		在root后面读取插入新文文件

写文件命令:w(另存为)

sed -r 'w 111.txt' 1.txt			把1.txt全部内容 写入111.txt
sed -r '/root/w 123.txt' passwd		把passwd的文件中有root的行另存为到123.txt
sed -r '1,5w 123.txt' passwd		把1,5行另存为123.txt

追加命令: a(行之后)

	sed -r 'a123' passwd			每行后面,都加上123行
	sed -r '2a 123' passwd			在第2行后面,加上123
	sed -r '$a 123' passwd			在最后一行后面,加上123
	sed -r '2a 1111\
> 3333333\
> 444444' passwd					插入段落,请使用\转义掉回车,不要忘了分号结束

插入命令: i(行之前)

 sed -r '2iaaaaaaaa' passwd			在第二行插入新行aaaaaaaaaa

替换整行命令: c

sed -r ‘2caaaaaaaa’ passwd 把第二行替换成aaaaaaaaa

获取下一行命令:n

sed -r '/root/{n;d}' passwd					n下一行的意思。找root行,然后下一行,删除
sed -r '/root/{n;n;d}' passwd 				n:next下一行可以用多次。
sed -r '/root/{n;s/bin/ding/g}' passwd 		{
     命令组合}   找到root行,下一行查找替换

反向选择: !

sed -r '2,$d' passwd				删除第二行到最后一行 
sed -r '2,$!d' passwd 				加了!号除了第二行到最后一行 其余的都删除

多重编辑 : e ;

sed -r -e '1,3d' -e '4s/adm/admin/g' passwd 		执行多个操作

暂存空间:hHGgx

shell文本处理三剑客之sed详解_第1张图片

暂存和取用命令:

h--------覆盖暂存空间 
H--------追加暂存空间 
g--------覆盖行 
G--------追加行 
x--------模式空间和暂存空间互换
sed -r '1h;$G' passwd.txt			
			//把第一行覆盖到暂存空间,在最后一行的时候将模式空间的内容追加到最后一行下面
sed -r '1{h;d};$G' passwd.txt		
			//把第一行覆盖到暂存空间并删除,在最后一行在调用追加,相当于把第一行剪切到最后一行
sed -r '1h;2,$g' passwd.txt			
			//把第一行覆盖到暂存空间,从第二行到最后一行,每读一行就从暂存空间调回来,这里用的g表示覆盖,因此每调用一次都会把原来的内容覆盖掉,这样整个文本都会和第一行一样
sed -r '1h;2,3H;$G' passwd.txt		
			//把第一行覆盖到暂存空间,第二行第三行追加到暂存空间,在最后一行的时候在调用暂存空间的内容,这里的动作是追加

示例

sed -r ‘4h;5x;6G’passwd
处理过程:
	拿出第一行进入模式空间匹配指令没有说第一行处理完成输出到屏幕上
	到了第四行进入模式空间h指令抄一份放到暂存空间然后输出到屏幕
	第五行进入模式空间x指令和暂存空间互换输出到屏幕是第四行的内容
	第六行进入模式空间G指令把暂存空间的内容(第5行的内容)追加到第六行的后面

你可能感兴趣的:(shell脚本,正则表达式,shell,运维,centos,服务器)