sed:Steam EDitor
流编辑器(行编辑器)(全屏编辑器:nano、vi)
模式空间:sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sed,sed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。
sed默认不修改原文件,仅对模式空间的内容进行编辑,最后显示模式空间的内容
格式:
sed [option] 'Addresscommand' file ...
address:
startline,Endline
比如1,100 表示第1到100行
$:最后一行
/pattern/
模式匹配到的行,比如/root/,表示包含root的行
/pattern1/,/pattern2/
表示从第一次别模式1匹配到的行开始,到第一次被模式2匹配到的行结束,这中间所有的行
lineNumber
行号所指定的行
startline,+N
从指定的行号开始,向后的N行
Address不写的话,默认是全文
Command:
大P:打印模式空间
p:显示符合条件的行
d:删除符合条件的行
a \string:在指定的行后面追加新行,内容为string
\n:可以用于换行
i \string:在指定的行前面追加新行,内容为string
r FILE:将指定的文件内容追加至符合条件的行后面
w FILE:将指定范围内的内容另存至指定的文件中
s/pattern/string/修饰符:查找并替换,默认只替换每行中第一次被查找到的字符串
修饰符:
g:全局替换
i:忽略字符大小写
s///格式也可以用s@@@、s###等
\(\),\1,\2支持正则表达式里面的分组功能
&:引用模式匹配整个串
option:
-n:静默模式,不再默认显示模式空间的内容
-i:直接修改原文件
-e script -e script:可以同时制定多个脚本
-f /path/to/file :从文件中读取脚本
-r :表示使用扩展的正则表达式
s///分组使用示例:
[root@logstach ~]# cat 1.txt
hello ,my love
listen like
假设我们要一次性把1.txt里面l..e能匹配到的字符后面加个r,比如like变成liker,这个时候,用类似s/l..e/string/ 是无法达到我们想要的结果的,但是分组功能或者使用&可以实现:
[root@logstach ~]# sed 's/\(l..e\)/\1r/' 1.txt
hello ,my lover
listen liker
[root@logstach ~]# sed 's/l..e/&r/' 1.txt
hello ,my lover
listen liker
sed练习:
1、删除/etc/grub.conf文件中行首的空白符;
sed 's/^[[:space:]]*//' /etc/grub.conf
2、替换/etc/inittab文件中“id:3:initdefault:”一行中的3为5;
sed 's/id:3:initdefault:/id:5:initdefault:/' /etc/inittab
3、删除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
4、删除/etc/inittab文件中开头的#号;
sed 's/^#//' /etc/inittab
5、取出一个文件路径的目录名称;
echo "/etc/inittab/" |sed -r 's/^(\/.*\/)[^/]+\/?/\1/g'
\/.*.\/是利用正则的贪婪性取出第一个/到可以匹配的最后一个斜杠内容,就是文件的路径了
\1匹配第一()里面的内容,这里的作用是用第一()的内容替换整个字符串,最后显示
第一个^是行开头的意思
第二个^取非的意思,[^/]+就是不是/的字符一个或者多个,\/?是0或者1个/
由于不在()里面,所以不打印
取路径有很多种方法
${file%/*}
dirname
都可以
'
本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1732936 ,如需转载请自行联系原作者