REDHAT 5 下学习SED 命令总结
SED 功能之强大,我只窥冰山一角,忘后续有人续之。
1、定义
SED: 是stream editor 的缩写。从一段文字中一行一行(这里一行是sed 默认的一条记录,sed 是按记录读入到内存即模式空间的)的按顺序读入内存中(模式空间),模式不匹配的直接输出,模式匹配(正则表达式匹配原则)的记录进过流控制器(一系列SED 命令,当然其中的SED 命令可能删除了这行,所以就什么都不输出直接转向下一行)之后才输出,接着就是下条匹配的记录,Go on and on 所有记录一一copy到模式空间,寻找匹配的处理,输出 ,sed 结束。
怎么用 sed ‘操作的内容和指令’ 待操作的内容
你可以直接 sed -e '操作的内容和指令' 待操作的文件名
Sed -f sedscript_name 待操作的文件名
3、实际用法
Eg; $ head -n10 /etc/passwd > /tmp/passwd.bak
$ sed -e '1,5d' /tmp/passwd.bak
$ cat /tmp/passwd.bak
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
:
$sed '1,5d' /tmp/passwd.bak
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
:
那么只删除1--5 行,其他都在模式空间中,所以完毕了输出了6-10 的内容。
SED命令行选项
-n : 阻止没有匹配命令输出
-e : 执行sed 命令,可以在一行中执行多条sed 命令
-f : 指定sed 脚本文件的名称
命令行选项的解释:
$sed 's/root/root_x/' /tmp/passwd.bak
root_x:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
:
S --- substitute 的缩写,替换的意思。 但是为什么都输出了,可以用sed 定义中的,sed 流程控制过程来解释。
$ sed -n 's/root/root_x/p' /tmp/passwd.bak
-n 默认都不打印(模式空间),但是p (Print) 又是显示命令,所以输出如下:
$ root_x:x:0:0:root:/root:/bin/bash
SED 地址的概念
[地址空间] {
命令集合
}
所有的命令都是对地址空间操作的,当然命令集合中还可以有地址空间,可以嵌套。
s/CA/California/g -----------全部记录中的 CA 替换成 California
/Sebastopol/s/CA/California/g ----同上,不过限制了地址空间在匹配了Sebastopol的所有行上
$ d ----- 删除所有的行
$ 1d ------- 删除首行 $d 删除末行
$ 1,/^$/d ------ 删除首行到第一空行之间的所有行
$ /^\.TS/,/^\.TE/!d ------ 删除.TS --TE 之间以外的所有记录(!---反地址模式匹配)
sed -n "/^\.deBL/,/^\.\.$/p" /usr/lib/macros/mmt
打印从.deBL 开始的行到.. 结尾的行之间的所有行打印出来
sed -s 's/<.*>//g' ollir Page
输出的内容为空。 问题: 这是应为sed 讲究的是最大匹配< 找到本行中最后一个 > 直接所有(.*)都清空。 要把 的内容清空为<> 。 $ sed '/<[^>]>//g'
$ sed -n -e '=' -e 'p' /etc/passwd ------ 执行两个指令(-e ; -e ) 一个打印行号(=)
DOS 文本文件和 UNIX 文本文件互换:
$ sed -e 's/$/\r/g' myunix.txt > mydoc.txt
$ sed -e 's/.$//g' mydoc.txt > myunix.txt
解释: unix 的文档都是以换行LF 结束的。 而DOS 却是以\r LF 两个字符结束的。
Unix 的末行加上一个字符 '\r' , DOS 一行的最后一个字符去掉 。
附: 对pattern space and hold space 一些粗浅的见解
$ cat foo
11111111111111
22222222222222
test33333333333333
44444444444444
55555555555555
$sed 'x;p;x' foo
11111111111111
22222222222222
test33333333333333
44444444444444
55555555555555
-----实现了一个在每一行上增加一行。 实现原理: x 是实现 pattern space \ hold space interchage . 分析111111 读入,与空行(hold space 中内容默认是一个空行)互换,之后遇到p;直接输出模式空间中的内容(不用执行到命令行末)所以就打印空行。但是它不是next 指令不能实现控制流程的转变,还的接着执行x 命令,又把hold space 中的内容copy 到 pattern space 中,sed 命令全部结束,那么还要打印pattern space 中的内容,再读下一条,从而实现了在foo 的每一行前插入空行的效果。
可用验证你的逻辑:
$sed '/test/{x;p;}' foo
11111111111111
22222222222222
44444444444444
55555555555555
$ sed '/test/{p;x;}' foo
11111111111111
22222222222222
test33333333333333
44444444444444
55555555555555
那么看这个 sed '/pattern/{x;p;x;G} 行前行后插入空行
再看一个命令: sed 中 n 的用法:将模式空间拷贝于标准输出。用输入的下一行替换模式空间。
$ sed '{n;G}' foo------实习了2,4 ,行后插入空行。
11111111111111
22222222222222
test33333333333333
44444444444444
55555555555555
{n;n;G} 3,6 ,9 后边插入一空行。
sed '{n;d;}' foo 删除偶数行。
sed '$!N;$!D' foo ----- tail 倒数两行
N : Add a newline to the pattern space, then append the next line of input to the pattern space 在模式空间内容上加一个换行符,之后加入下一条记录到现在的模式空间
D:delete text in the pattern space up to the first newline, and restart cycle with the resultant pattern space, without reading a new line of input.
备注中文:
N: 追加下一个输入行到模式空间后面并在二者间嵌入一个新行号(newline),改变当前行号码为下一条记录的行号。如果没有下一个可处理的行,则退出
D:是删除模式空间开头到第一个\n(含)之间的内容,并且控制流跳到脚本的第一条语句,当前行号没有变。
P:就是输出模式空间开头到第一个\n之间的内容
还有 N 的另外一种用法
$ sed = foo | sed N
1
11111111111111
2
22222222222222
3
33333333333333
4
44444444444444
5
55555555555555
$ sed = foo | sed 'N;s/\n/\t/'
1 11111111111111
2 22222222222222
3 33333333333333
4 44444444444444
5 55555555555555
$ sed '1!G;h;$!d' foo
$ sed -n '1!G;h;$p' foo
这两条都可以实现逆序输出文件
阅读(452) | 评论(0) | 转发(0) |