Linux三剑客之sed

sed

  非交互式的编辑器,可以修改文件,也可以使用重定向来保存结果。

 

具体过程

  首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模拟空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。Sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。

 

定址

  决定对哪些行进行编辑,若没有,则对整个文件进行编辑。

 

例如:

sed –n ‘3p’ datafile
    表示只打印第三行($符号表示最后一行)
Sed –n ‘100,200p’ datafile
    表示查看文件的第100行到第200行
sed ‘2,5d’ datafile
    删除第二到第五行
sed ‘/my/,/you/d’ datafile
    删除包含“my”的行到包含“you”的行之间的行
Sed ‘/my/,10d’ datafile
    删除包含“my”的行到第十行的内容

 

命令

a\    新增行,在匹配行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
c\    替换行,用此符号后的文本替换匹配行中的文本,多行除最后一行用“\”
i\    插入行,此字符后的文本插入到匹配行的上面
d    删除行,删除匹配到的行
p    打印行,将某些行输出。通常p会与参数-n一起使用,只输出匹配的行
s    替换字符串

 

选项

-n    在sed的基本用法中,所有来自标准输出的信息都会被列出到终端上。加上-n参数后,则只有被sed处理的那些行才会被输出。
-e    同时执行多个命令文本时才需要指定-e选项。
-f    同时执行多个命令文本时,可将这些命令文本写到一个文本中,然后通过-f filename的方式使用。
-i    直接修改读取的文档,而不是输出到终端

 

实例:

删除行

sed ‘$d’ filename
    删除最后一行,显示其他行,文件本身不会发生改变
sed ‘/my/d’ filename
    删除包含my的行,其余的都被显示
sed –i ‘3d’ filename
    文件的第三行删除掉,什么也不显示,文件发生变化

 

新增行

sed ‘1a hello world’ filename
    在第一行下面新增一行,内容为hello world
sed ‘$a hello world’ filename
    在最后一行下面新增一行,内容为hello world
sed ‘1,3a hello world’ filename
    在第一行,第二行和第三行下面分别增加一行,内容为hello world
sed ‘1a hello world\nhello world’ filename
    在第一行下面添加两行,内容都为hello world,多行使用换行符\n
sed –e ‘1a xxx’ –e ‘2a yyy’ –e ‘3,5d’ filename
    -e选项用来指定命令文本,如果只有一个命令文本时可以省略,多个就要用-e

 

插入行

sed ‘1i hello world’ filename
    在第一行的上面插入一行,内容为hello world

command.txt的内容:
1i hello world
2i hello girl
3i hello boy
sed –f command.txt filename
    当需要添加的行很多时,就不适合用-e了,这时把添加的行放到一个文本文件里,然后用-f来引用

 

替换行

sed ‘1c hello world’ filename
    把第一行替换为hello world
sed ‘1,3c hello world’ filename
    把第一行到第三行替换为hello world,是把三行替换成一行

 

替换字符串

sed ‘s/hello/hi/’ filename
    把hello替换为hi,只有每一行的第一个hello被替换了
sed ‘s/hello/hi/g’ filename
    把匹配到的所有hello都替换为hi
sed ‘2,3s/hello/hi/g’ filename
    把第二行和第三行的所有hello替换为hi
Sed ‘s/hello//g’ filename
    删除所有的hello

 

定界符(默认/)

echo ‘/home/nick/book’ | sed ‘s;/home/nick/;/home/jack/;’
echo ‘/home/nick/book’ | sed ‘s#/home/nick/#/home/jack/#’

 

sed –n ‘2,3s/hello/hi/gp’ filename
    将文件里第二行和第三行所有的hello改为hi,并打印出来
sed ‘hello/p’ filename
    默认把所有输入行都打印到输出上,匹配到hello的行还要另外再打印出来
sed –n ‘/hello/p’ filename
    打印出含有hello的行,-n取消了默认的打印
sed –n ‘/hello/Ip’ filename
    默认的匹配是区分大小写的额,用大写字母I可以忽略大小写
sed ‘/hello/d’ filename
    删除匹配行
sed ‘/hello/a hello world’ filename
    在有hello的行下面添加hello world新行
sed ‘/hello/s/world/worlds/g’ filename
    找到含有hello的行,将这些行的world全部换为worlds
sed ‘1,20y/abcdq/wxyzg/’ filename
    将第一行到第二十行的所有a改为w,b改为x,…,也就是一对一方式转换

 

正则

/^my/    匹配所有以my开头的行
/my$/    匹配所有以my结尾的行
/m..y/    匹配包含字母m,后跟任意两个字符,再跟字母y的行
/my*/    匹配包含字母m,后跟零个或多个y字母的行
/[Mm]y/    匹配包含My或my的行
/[^Mm]y/        匹配包含y,但y之前的那个字符不是M或m的行
1,20s/\(you\)self/\1r/    处理第一到第二十行,you被保存为标签1,若发现youself,则改为yourself
s/my/**&*/    符号&代表查找串,my将被替换为**my*
/\<my/    匹配包含以my开头的单词的行
/my\>/    匹配包含以my结尾的单词的行
/9\{5\}/    匹配包含连续5个9的行
/9\{5,\}/    匹配包含至少连续5个9的行
/9\{5,7\}/    匹配包含连续5到7个9的行

 

posted @ 2018-10-07 21:59  _chy  阅读(219)  评论(0编辑  收藏  举报