Sed文本处理工具原理与使用
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed命令格式
sed [选项] [动作]
选项与参数
-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。
常用命令
a:新增行, a 的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)
c:取代行,c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行
i:插入行, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
d :删除行,因为是删除,所以 d 后面通常不接任何参数,直接删除地址表示的行;
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
s :替换,可以直接进行替换的工作,通常这个 s 的动作可以搭配正规表示法,例如 1,20s/old/new/g 一般是替换符合条件的字符串而不是整行
(1)新增行
以/etc/passwd为例列出行号,在第二行后加上“hello,world”
如果想添加两行以上,在第二行增加两行,例如“hello,world”,“hello,linux”
(2) 删除行
删除1到10行
(3) 替换行
第一行替换为no number
1-5行替换为no number
(4)显示行
显示1到10行
显示奇数行
1~2意思为从第一行开始,隔两行打印
(5)数据的搜索并删除
删除/etc/passwd所有包含root的行,其他行输出
(6)数据的搜索并执行
搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:
(7)数据的搜索并替换
从第四行可以看到s命令只替换了每行搜索到的第一个aa,其他的aa并没有被替换
如果想对全文的aa替换就可以使用g命令,g表示全局替换
(8)数据的搜索并输出
p命令用于搜索符合条件的行,并输出该行,不做修改
可以看到第三行被输出,但是文件的全部内容都被输出,而第三行多输出一遍,sed默认情况是将文件的全部内容输出,如果需要指定哪一行要加上-n参数
(9)将修改应用到文件中(危险动作)
之前所做是我操作都没有修改文件的内容,只是看到修改的结果输出到控制台,但是并没有修改test.txt文件,我们可以使用-i参数直接修改文件内容
(10)把模式空间内容写到文件中
命令 w 可以把当前模式空间的内容保存到文件中。默认情况下模式空间的内容每次都会打印到标准输出,如果要把输出保存到文件同时不显示到屏幕上,还需要使用-n 选项。
将test.txt文件内容保存到output.txt 并显示在屏幕上
将test.txt文件内容保存到output.txt ,不在屏幕上显示
只保存第二行
sed的元字符集
^ 匹配行开始,如:/^sed/匹配所有以sed开头的行;
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行;
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d;
.* 匹配0个或多个字符,如:/sed/匹配所有模板是一个或多个空格后紧跟sed的行;
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed;
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行;
(…) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替换成lovers;
& 保存搜索字符用来替换其他字符,如s/love/* & /,love这成love**;
< 匹配单词的开始,如:/
> 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行;
x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行;
x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行;
x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行;
Sed Practice!
/etc/passwd
-
删除文件每行的第一个字符
sed 's/^.// /etc/passwd
-
删除文件每行的第二个字符
sed ‘s/.//2’ /etc/passwd
-
删除文件每行的最后一个字符
sed ‘s/.$//’ /etc/passwd
-
删除文件每行的倒数第二个字符
sed ‘s/\ (.* \ )\ (.\ )\ (.\ )$/\1\3/’ /etc/passwd
-
删除文件每行的第二个单词
sed ‘s/\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (…*\ )/\1\3\4\5\6\7/g’ /etc/passwd
-
删除文件每行的倒数第二个单词
sed ‘s/\ (… * :\ )\ (…* :\ )\ (… * : \ )\ (… * :\ )\ (… * :\ )\ (… * :\ ) \ (… * \ )/\1\2\3\4\5\7/g’ /etc/passwd
-
删除文件每行的最后一个单词
sed ‘s/\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (. * :\ )\ (… * :\ )\ (… * \ )/\1\2\3\4\5\6/g’ /etc/passwd
-
交换每行的第一个字符和第二个字符
sed ‘s/\ (.\ )\ (.\ )\ (.*\ )$/\2\1\3/’ /etc/passwd
-
交换每行的第一个字符和第二个单词
-
交换每行的第一个单词和最后一个单词
sed ‘s/\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (… * :\ )\ (. * :\ )\ (… * :\ )\ (… * \ )/\7\2\3\4\5\6\1/’ /etc/passwd
-
删除一个文件中所有的数字
sed ‘s/[0-9]//g’ /etc/passwd
-
删除每行开头的所有空格
sed -r ‘s/^ +//g’ /etc/passwd
-
用制表符替换文件中出现的所有空格
sed -r ‘s/ +/\t/g’ /etc/passwd
-
把所有大写字母用括号()括起来
sed ‘s/[A-Z]/(&)/g’ /etc/passwd
-
打印每行3次
sed ‘p;p’ /etc/passwwd
-
隔行删除
sed ‘0~2d’ /etc/passwd
-
把文件从第5行到第10行复制到第15行后面
nl /etc/passwd | sed ‘5h;6,10H;15G’
-
把文件从第5行到第10行移动到第15行后面
nl /etc/passwd | sed ‘5h;6,10H;15G’ | sed ‘5,10d’
-
只显示每行的第一个单词
sed ‘s/(. .:\ )(…:\ )(…:\ )(…:\ )(.:\ )(…:\ )(…*\ )/\1/’ /etc/passwd
-
打印每行的第一个单词和第三个单词
sed -n ‘s/(…:\ )(…:\ )(…:\ )(…:\ )(…:\ )(…:\ )(…*)/\1\3/p’ /etc/passwd
-
将格式为 mm/yy/dd 的日期格式换成 mm;yy;dd
date +%m/%y/%d |sed ‘s#/#; #g’