Sed Stream Editor
行编辑器(全屏编辑器:vi)
逐行读取到模式空间,处理完之后输出 默认不修改源文件,
仅对模式空间中的数据做处理,处理完之后将模式空间的内容追行打印
sed 'Address Command' file... ‘’ “” 都可以,如果有变量用弱引用
Address
1、StartLine,EndLine
1,100
$ 最后一行
$-1 倒数第二行
2、/RegExp/
/^root/ '/oot/d'
3、/pattern1/,/pattern2/
第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束
4、LineNumber
指定的行
5、StartLine, +N
从startLine开始,向后的N行
Command
-i 直接修改源文件
-n 静默模式,不再显示模式空间中内容
-e SCRIPT -e SCRIPT 可以同时执行多个脚本(COMMAND)
sed --e '1,10d' -e 's/L\(..e\)r/l\1/g' /shell/1
-f 用脚本处理/PATH/TO/SED_SCRIPT
vi /shell/script
2a\two numbers
4s/#/@/g
$i\end numbers
sed -f /shell/script /shell/1
-r 适用扩展正则表达式
错误的写法 history | sed -r 's/^[[:space:]]\(.*\)/\1/'
d 删除行
sed '1d' 删除第一行
sed '3,$d' /tmp/inittab 删除第三行到最后一行
sed '1,+2d' /tmp/inittab 删除第一行到第三行
sed '/^\//d' /etc/fstab 删除以\开头的行
p 显示匹配到的行
sed '/^\//p' /etc/fstab 匹配到的显示2次,因为sed默认会显示模式空间的行
sed -n '/^\//p' /etc/fstab
a \string 在匹配到的行后面,追加新行,内容为"string" a后面加\利于实现特殊字符
sed '/^\//a\# hello world \n#hello linux' /etc/fstab 在\开头行后加2行注释
sed '/^\//a#hello\n#hello' /etc/fstab a
i \string 在匹配到的行前面,追加新行,内容为"string"
r file 将制定文件内容添加至符合条件的行后
sed '2r /etc/inittab' /shell/1
sed '1,2r /etc/inittab' /shell/1 第一行后面添加一遍,第二行后面添加一遍
w 将指定范围内的内容另存至指定的文件中,如果是已存在文件会覆盖其内容,如果不存在会建立文件并保存内容
sed -n '/^#/w /shell/2' /etc/inittab
s /pattern/string/ 查的并替换 默认开始只替换每行的第一个
sed '1,3s/#/$/' /shell/1
sed 's/^\//#/' 2 替换以/开头的行为#
sed '1s/#/$/;3s/#/$/' /shell/1 替换第一行第三行第一个匹配到的
修饰符
g 全部替换
sed '1s/#/$/g;3s/#/$/' /shell/1 替换第一行全部和第二行第一个匹配到的
i 匹配时忽略大小写
sed 's/inittab/haha/ig' /shell/1 替换全文inittab时忽略大小写,替换为haha
s /正则表达式/字符串( 支持引用,不支持正则)/ s$$$ s@@@ s%%% 这样不适用查找中带有的,平时适用/,这样查找/是就不用转义了
后向引用 \(\) \1 \2
l..e like --> liker love -->lover 两种实现 \(\) &
sed 's/\(l..e\)/\1r/' /shell/1
& 引用模式匹配整个串
sed 's/l..e/&r/' /shell/1
只引用一部分的时候,后项引用可以细化第一个pattern,&则是全部匹配,
实现like --> Liker love -->Lover
sed 's/l\(..e\)/L\1r/g' /shell/1
现实删除history前面的空白字符
history | sed -r 's/^[[:space:]]*//g'
练习
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>1、删除</code><code>/etc/grub</code><code>.conf文件中行首的空白字符</code>
<code> </code><code>sed</code> <code>'s/^[[:space:]]*//'</code> <code>/etc/grub</code><code>.conf</code>
<code>2、替换</code><code>/etc/inittab</code><code>文件中“</code><code>id</code><code>:5:initdefault:"一行中的数字为3;</code>
<code> </code><code>sed</code> <code>'s/^\(id\):5:\(initdefault\)/\1:3:\2/'</code> <code>/etc/inittab</code>
<code>3、删除</code><code>/etc/inittab</code><code>文件中的空白行</code>
<code> </code><code>sed</code> <code>'/^$/d'</code> <code>/etc/inittab</code>
<code>4、删除</code><code>/etc/inittab</code><code>文件中开头的</code><code>#号,但要求#号后面必须有空白字符</code>
<code> </code><code>sed</code> <code>'s/^#\([[:space:]]\+\)/\1/'</code> <code>/shell/inittab</code>
<code>5、删除</code><code>/etc/inittab</code><code>文件中开头的</code><code>#号和空白字符,但要求#号后面必须有空白字符</code>
<code> </code><code>ed -r </code><code>'s/^#[[:space:]]+//'</code> <code>/shell/inittab</code>
<code> </code><code>sed</code> <code>'s/^#\([[:space:]]\+\)//'</code> <code>/shell/inittab</code>
<code>6、取出一个文件路径的目录名称</code>
<code> </code><code>echo</code> <code>"/shell/asdasd/inittab"</code> <code>| </code><code>sed</code> <code>'s/^\(.*\)\/.*$/\1/'</code>
<code> </code><code>echo</code> <code>"/shell/haha/inittab"</code> <code>| </code><code>sed</code> <code>'s#^\(/.*\)/.*#\1#'</code>
<code> </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^(/.*/)[^/]+/?#\1#'</code>
<code>7、取得路径基名</code>
<code> </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^/.*/([^/]+)/?#\1#'</code>
<code>8、删除某文件中以空白字符后面跟</code><code>#类的行中的开头的空白字符及其#</code>
<code> </code><code>sed</code> <code>'s/^[[:space:]]#\(.*\)/\1/'</code> <code>/shell/inittab</code>
本文转自 ftmoonfans 51CTO博客,原文链接:http://blog.51cto.com/soulboy/1259038