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的行