今天遇到sed的相关用法,再次对sed的用法进行总结;
1. 替换命令
sed 's/{old_value/{new_value}/}'
实现使用new_value替换old_value的操作;例如
echo it is not your fault | sed 's/fault/problem/'
it is not your prolbem
多个修改替换,可以采用-e的方式,也可以使用;多次隔开。例如
第一种方式:echo it is not your fault | sed -e 's/your/my/' -e 's/fault/problem/'
第二种方式:echo it is not your fault | sed 's/your/my/ ; s/fault/problem/'
两条语句的效果是一样的,输出都是:
it is not my problem
第三种方式:sed后加一个撇号,然后回车,可以采用多行输入的方式.
全局修改
sed命令类似于替换命令,每次都处理每行中第一个出现的选定序列,要实现全局的修改,需要使用下面的格式
sed 's/{old_value}/{new_value}/g'
匹配替换
sed命令可以实现特定匹配字段的字符替换,例如
sed '/your/ s/fault/problem'将your后面的fault改成为problem。
需要注意的一点:sed执行替换命令是每行单独执行的,它处理过程以行为单位,如果在某一行找到匹配内容,那么将从改行的第一处进行替换修改,加入/g也是在改行的所有的位置进行修改。。如果在改行中没有找到前面的匹配字段,则不进行修改。例如file
it is not your fault, but my fault
it is not my fault, but his fault
fault is not the reason
在上面的文档中,如果采用 sed '/your/ s/fault/problem/' file 那么只有在第一行找到相关的your匹配字段,那么修改第一个fault为problem,似乎执行正确。
但是,如果采用 sed '/my/fault/ s/fault/problem/' file 那么在前两行都可以匹配到my,那么就会替换前两行中第一次出现fault的地方为problem,输出为:
it is not your problem, but my fault
it is not my problem, but his fault
fault is not the reason
同样的,如果加/g,那么也只是在当前行的所有值替换,因此需要谨慎使用。
还需要注意的就是,这里只是改变了显示,想要保存到指定文档中,需要重定向。
源文件/脚本文件
sed -f script-file file
sed命令可以使用脚本文件,-f后面可以为相应的脚本文件,值得注意的是,脚本文件中不使用撇号
限制行
编辑器默认查看输入到流编辑器中的每一行,且默认在输入到流编辑器中的每一行上进行编辑。这可以通过在发出命令之前指定约束条件来进行修改。例如
sed '3,4 s/fault/problem/' file 默认将第三行和第四行的fault值进行替换
禁止显示
"-n" 覆盖了所有的显示,并且不显示任何一行,而无论它们是否被编辑操作修改。
2.删除行
sed '{what to find} d'
删除相应的行,这里由what to find限制到某一特定行
上三角号 (^) 表示一行的开始
美元符号 ($) 代表文件的结尾,或一行的结尾
sed '/fault/ d ' file
删除file中包含fault的行
sed '/fault/ !d' file
删除file中包含fault之外的所有行
sed '/^$/ d' {filename}
删除文件中的所有空白行
sed ‘1,/^$/ d’ {filename}
删除文件中第一行到第一个空行
3.插入/添加/写到文件
sed '3i *****' 从第三行插入
sed '3a*****' 从第三行添加
sed ‘×××××× 1,3w new_file’ 重新将第一行到第三行写到新文件中
4.修改
sed '/file/ c **************'
修改这里是指,将匹配到的整行进行修改,将原来的整行修改为新的内容,只要匹配,整行进行替换
$: 表示句尾. 如 abc$ 表示以 abc 结尾的句子.
\<: 表示词首. 如 \<abc 表示以 abc 为首的詞.
\>: 表示词尾. 如 abc\> 表示以 abc 結尾的詞.
本文主要参考:
http://flierlh.iteye.com/blog/132809
http://fangfang0717.blog.51cto.com/236466/130525/