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 hello world’ filename 在第一行下面添加两行,内容都为hello world,多行使用换行符 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的行