Linux文本处理之sed
上一篇我介绍了文本处理grep,现在我来介绍一下文本处理三剑客的第二剑客——sed。
sed 是一个比较古老的,功能十分强大的用于文本处理的流编辑器,加上正则表达式的支持,可以进行大量的复杂的文本编辑操作。sed 本身是一个非常复杂的工具,有专门的书籍讲解 sed 的具体用法,但是个人觉得没有必要去学习它的每个细节,那样没有特别大的实际意义。sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。
1.sed用法
sed [-hnV][-e<script>][-f<script文件>][文本文件]
2.参数说明(选项命令)
-e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
- -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
- -n或--quiet或--silent 仅显示script处理后的结果。
- -V或--version 显示版本信息。
- -i.bak 备份文件并原处编辑
- -r 可以使用扩展正则
-h或--help 显示帮助。
3.动作说明(编辑命令)
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除,所以 d 后面通常不接任何东西;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作,通常这个 s 的动作可以搭配正规表示法
- =:为模式空间中的行打印行号
- !:模式空间匹配行取反处理
4.地址定界
a.关于定址:
默认情况下sed会对每一行内容进行匹配、处理、输出,某些情况不需要对处理的文本全部编辑,只需要其中的一部分,比如1-10行,偶数 行,或者是包含"hello"字符串的行,这种情况下就需要我们去定位特定的行来处理,而不是全部内容,这里把这个定位指定的行叫做"定址"
b. 数字定址:数字定址其实就是通过数字去指定具体要操作编辑的行,如下:
[[email protected](yuaning) ~]# cat abc.txt a b c d e [[email protected](yuaning) ~]# sed -nr '4s/d/4/p' abc.txt (指定第4行的d替换成4,-n默认不输出,记得在正则表达式最后加上p) 4
[[email protected](yuaning) ~]# cat abc.txt 1linux 2linux 3linux 4linux 5linux [[email protected](yuaning) ~]# sed -n '2,4s/linux/hello/p' abc.txt 2hello 3hello 4hello (指定第2行到第4行的字符Linux替换为hello)
[[email protected](yuaning) ~]# sed -n '1,+2s/linux/hello/p' abc.txt 1hello 2hello 3hello (指定第1到1+2行的字符Linux替换为hello)
[[email protected](yuaning) ~]# sed -n '$s/linux/hello/p' abc.txt 5hello ($表示最后一行)
[[email protected](yuaning) ~]# sed -n '2!s/linux/hello/p' abc.txt 1hello 3hello 4hello 5hello (!表示除了指定行以外的行,记得不要写反了)
c.正则表达式定址:正则定址使用目的和数字定址完全一样,使用方式上有所不同,是通过正则表达式的匹配来确定需要处理编辑哪些行,其它 行就不需要额外处理,如下:
[[email protected](yuaning) ~]# cat abc.txt 1linux 2linux 3linux 4linux 5linux [[email protected](yuaning) ~]# sed '/3linux/d' abc.txt 1linux 2linux 4linux 5linux (表示只把指定行删除,其他行不变)
[[email protected](yuaning) ~]# cat abc.txt 1linux 2linux 3linux 4linux 5linux 666 [[email protected](yuaning) ~]# sed '/^[[:digit:]].*/d' abc.txt [[email protected](yuaning) ~]# sed '/^[[:digit:]][[:lower:]]\+/d' abc.txt 666 (用正则表达式选择匹配的行删除)
d.数字和正则混合使用:正则表达式和数字组合更为灵活
[[email protected](yuaning) ~]# cat abc.txt 1linux 2linux 3linux 4linux 5linux 666 [[email protected](yuaning) ~]# sed '4,/^$/d' abc.txt 1linux 2linux 3linux 666 (表示删除从第4行到空白行)
e.高级使用:读取一个数据指令从第一个挨个执行到最后一个指令,指令用;隔开,然后进行下一个数据的循环,直到数据全部执行一次
模式空间和保持空间:模式空间初始化为空,处理完一行后会自动输出到屏幕并清除模式空间;保持空间初始化为一个空行,也就是默
认带一个\n,处理完后不会自动清除。模式空间和保持空间,从程序的角度去看,其实就是sed在工作的时候占用了一些内存空间和地址,
sed工作完毕就会把内存释放并归还给操作系统。
g:将保持空间的内容拷贝到模式空间中,原模式空间将被清零。
G:将保持空间的内容追加到模式空间\n之后。
h:将模式空间的内容拷贝到保持空间中,原保持空间将被清零。
H:将模式空间的内容追加到保持空间\n之后。
d:删除模式空间中的所有行,并读入下一行。
D:删除模式空间的第一行,不读入下一行。
x:交换内容
n:读取匹配到的下一行覆盖至模式空间。
N:读取匹配到下一行追加到模式空间后。
[[email protected](yuaning) ~]# seq 1 10 |sed -n 'n;p' (打印偶数行) 2 4 6 8 10 (把读取到1放到模式空间,然后n指令紧接着把下一行的2覆盖1,然后p指令打印)
[[email protected](yuaning) ~]# seq 1 5 |sed '1!G;h;$!d' (倒序输出) 5 4 3 2 1 [[email protected](yuaning) ~]# seq 1 5 |sed -n '1!G;h;$p' 5 4 3 2 1
[[email protected](yuaning) ~]# seq 1 5 |sed 'N;D' (输出最后一行) 5 [[email protected](yuaning) ~]# seq 1 5 |sed '$!d' 5
[[email protected](yuaning) ~]# seq 1 5 |sed '$!N;$!D' (输出最后两行) 4 5
[[email protected](yuaning) ~]# seq 1 3 |sed 'G' (每行后面加一个空行) 1 2 3
[[email protected](yuaning) ~]# seq 1 10 |sed 'n;d' (输出奇数行) 1 3 5 7 9
sed的用法很多,更多的需要在以后的工作中慢慢摸索,这里只是一个简单的记录。
原文地址:http://blog.51cto.com/13805636/2151558