Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1132256
  • 博文数量: 300
  • 博客积分: 37
  • 博客等级: 民兵
  • 技术积分: 772
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-26 04:46
文章分类
文章存档

2017年(4)

2016年(7)

2015年(19)

2014年(72)

2013年(71)

2012年(127)

分类: LINUX

2013-05-01 16:27:36

原文地址:linux sed 流编辑器 作者:htckiller2010


sed 是一种新型的,非交互式的编辑器。

sed -V  or sed --version 可以查看sed版本

sed 的工作过程

sed编辑器逐行处理文件或输入,并将输出结果发到屏幕。
sed把当前正在处理的行保存在一个临时缓冲区中(模式空间或临时缓冲),sed处理完毕模式空间中的行后,就把该行发送到屏幕上。sed每处理完一行就将其从模式空间中删除,然后将下一行读入空间,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改或破坏源文件。

如图:



sed 在文件中查找模式也要使用正则表达式RE和各种元字符。正则表达式是括在斜杠之间的模式,用于查找和替换。

sed -n '/RE/p' filename  格式
sed -n '/love/p' datafile 

sed  -n 's/RE/replacement string/'filename 格式
sed -n 's/love/like/' datafile

sed 命令选项列表
a\    在当前行后添加一行或多行
c\    用新文本修改(替换)当前行中的文本
d     删除行
i\    在当前行之前插入文本
h     把模式空间里的内容复制到暂存缓冲区
H     把模式空间的内容追加到暂存缓冲区
g     取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有的内容
G     取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容的后面
l     列出非打印字符
p     打印行
n     读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
q     结束或退出sed
r     从文件中读取输入行
!    对所选行以外的所有行应用命令
s     用一个字符串替换另一个

替换标志
g   在行内进行全局替换
p   打印行
w   将行写入文件
x   交换暂存缓冲区与模式缓冲区空间的内容
y   将字符转换为另一字符

-e  允许多项编辑
-f  指定sed脚本文件名
-n  取消默认的输出

sed支持的元字符跟grep 一样,只是多了 下面一个

&  保存查找窜以便在替换窜中引用    s/love/**&**/    &代表查找窜。字符串love将替换前后各加了两                                                     个星号的引用,即:love变成**love**



sed 范例
P命令:用于显示模式缓冲区的内容
1.sed '/north/p' datafile

注意:默认情况下sed把所有输入行都打印在标准输出上。如果在某一行匹配到模式north,sed 将把该行再打印一遍。

上面的命令,sed 将打印datafile中所有的行,如果查找到匹配模式north,则再打印一遍该行。

-n 选项,用于取消默认的打印操作。

sed -n '/north/p' datafile
将只打印匹配模式north 的行

d命令: 删除
2.sed '3d' datafile
删除第三行,其余的行都被打印到屏幕上。

sed '/west/!d' datafile

删除不包含west的行

sed 's/....//' datafile
删除每行的前4个字符

sed 's/...$//' datafile
删除每行的后3个字符



sed '3,$d' datafile
删除从第三行到最后一行,剩余各行被打印到屏幕上

sed '/north/d' datafile
删除所有包含模式north 的行,其余各行被打印

s命令:替换
3.sed 's/west/north/g' datafile
将每行中出现的模式west,替换成 north;如果没有g 命令,则只将每行的第一个west 替换

sed -n 's/^west/north/g' datafile
只打印发生替换的那些行,即:只有在行首找到west 并将其替换成north 时,才打印此行

sed ‘s/[0-9][0-9]$/&.5’datafile
& 代表查找窜中匹配到的内容。 所有以两位数字结尾的行后面都被加上.5

sed -n 's/Hemenway/Jones/gp' datafile
只打印Hemenway被替换成Jones的 行

sed -n 's/\(Mar\)got/\1ianne/p' datafile
包含在圆括号里的模式Mar 作为标签1保存在特定的寄存器中。替换窜可以通过\1 引用它,则Margot被替换为Marianne。

sed 's#2#88#g' datafile
紧跟在s后面的#就是查找窜和替换窜之间的分隔符。分隔符默认为/,但可以改变。

逗号:指定行的范围
sed -n‘/west/,/east/p’ datafile
打印在模式west和east 之间的所有行。
如果west出现在ease之后的某一行,则打印的范围从west所在行开始,到下一个出现east的行或文件末尾(如果谴责未出现)

sed -n '5,/^northeast/p' datafile
打印从第5行到第一个以northeast开头的行之间的所有行

sed '/west/,/east/s/$/**VACA**/' datafile
修改从模式east到west之间的所有行,将各行的行尾($)替换成字符串**VACA**。


-e选项 :多重编辑

sed -e '1,3d' -e 's/Hemenway/Jones/' datafile
第一重编辑:删除第1-3行
第二重编辑:将Hemenway替换成Jones
因为是逐行进行这两项编辑,(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。

-r选项:读文件,读取文件指定的行。

cat newfile

abcdefghijklmnopqrstuvwxyz

newfile内容如上

sed '/susan/r newfile' datafile
如果在文件datafile中的某行匹配到模式susan,就在该行后读入文件newfile的内容。如果出现的不止一行,则出现的各行后都读入newfile内容。

-w选项:写文件,把指定行写入新文件中

sed -n '/north/w newfile' datafile
 所有包含模式north的行都被写入到文件newfile中。

a\ 命令:追加

追加新文本到文件中当前行的后面。如果要追加的内容超过行,则每一行都必须以反斜杠结束。最后一行除外、最后一行将以引号和文件名结束、用于追加的文本必须出现在追加命令的下一行上。

sed '/^north /a\\
this is the position' datafile
所有以north开头,后跟一个空格的行后面追加"this is the position"。
注意: a后的第二个反斜杠用来转义表示换行

i\ 命令:插入

在当前行的行前插入新文本。

sed '/east/i\\
NEW ENGLAND REGION\\
------------------------' datafile

超过一行的,每行后面都必须以反斜杠结尾!


c\命令:修改

sed 使用该命令将已有的文本修改成新的 文本,旧文本被覆盖;

sed '/eastern/c\\
the old region has been temporarily closed' datafile

该命令将完整地修改在模式缓冲区中的当前行。


n 命令: 或许下一行

sed使用该命令或许输入文件的下一行,并将其读入到模式缓冲区中,任何sed命令都将应用到匹配行紧接着的下一行上。

sed '/eastern/{ n;s/AM/Archie/; }' datafile

如果某行匹配到模式eastern,n命令就指示sed 用下一个输入行(即包含AM的那行)替换模式空间中的当前行,并用Archie替换该行中的AM,然后打印该行,在继续往下处理、


y命令:转换

字符按照一对一的方式从左到右进行转换。

sed '1,3y/abcde/ABCDE/' datafile
把datafile中第1-3行中的小写字母abcde转换成大写字母ABCDE

q命令: 退出

sed '5q' datafile

打印完第5行后,q命令让sed退出。


暂存和互换: h命令和x命令

x 表示互换
sed 使用该命令互换暂存缓冲区中的模式与模式缓冲区中的当前行。

sed -e '/north/h' -e '/west/x' datafile

sed 查找datafile中匹配模式north的行后,将其存放在暂存缓冲区,然后,当它找到匹配模式west的行后,就将模式空间中的内容与暂存缓冲区中的互换。 简而言之:包含west的行将被包含north的行替换。

暂存和取用:h命令和g命令



 
















阅读(612) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~