您的位置:首页 > 其它

sed命令

2016-01-08 16:14 239 查看
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
都可以

本文出自 “单季稻” 博客,请务必保留此出处http://linzb.blog.51cto.com/5192423/1732936
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: