• 每天进步一点点!

文章分类

推荐网站

常用手册

流编辑器sed(二)【原创】

<<返回

2011-12-08 11:46:49

sed范例

 

cat test_sed.txt

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     ABC

ABC     Def     hIc     lmN     dsf

A BC     Def     hIc     lmN     ABC

You     are     a       good    boy

you     are     not     a       good girl

That's  a       very    lovely  dog

 

例1. 打印:p命令

 

sed '/abc/p' test_sed.txt 

 

输出:

abc     def     hic     lmn     abc

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     ABC

ABC     Def     hIc     lmN     dsf

A BC     Def     hIc     lmN     ABC

You     are     a       good    boy

you     are     not     a       good girl

That's  a       very    lovely  dog

 

说明:p命令用于打印操作。默认情况下sed将所有输入行都打印在屏幕上,如果在某一行匹配到模式,sed将把该行另外再打印一遍。

 

sed -n '/abc/p' test_sed.txt

 

输出:

 

abc     def     hic     lmn     abc

 

说明:默认情况下sed打印当前模式缓冲区的输入行,命令p指示sed再次打印该行。选项-n用于取消sed的默认打印动作。选项-n和p配合使用时,模式缓冲区内的内容只打印一次。

 

例2. 删除:d命令

 

命令d用于删除输入行。sed先将输入行从文件复制到模式缓冲区,然后对该行执行sed命令,最后将模式缓冲区的内容输出到屏幕上。如果发出的是d命令。当前模式缓冲区里的输入行将被删除,不被显示。

 

sed '3d' test_sed.txt

 

输出:

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     dsf

A BC     Def     hIc     lmN     ABC

You     are     a       good    boy

you     are     not     a       good girl

That's  a       very    lovely  dog

 

说明:删除第三行,默认情况下,其余行都被打印在屏幕上。

 

sed '3,$d' test_sed.txt

 

输出:

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

 

说明:删除从第三行到最后一行的内容,剩余行将被打印。美元符号($)代表文件的最后一行,逗号被称为范围操作符。

 

sed '/^[Aa]/d' test_sed.txt  

 

输出:

 

123     456     1.23    4.5     321

You     are     a       good    boy

you     are     not     a       good girl

That's  a       very    lovely  dog

 

说明:删除以A或a开头的行,剩余行将被打印。

 

sed '/^A/, /^y/d' test_sed.txt 

 

输出:

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

That's  a       very    lovely  dog

 

说明:删除从以A开头的行开始到以y开头的行之间的所有行,打印剩余行。

 

例3.替换: s命令

 

命令s是替换命令。s后包含在文本中的内容是正则表达式,后面跟着的是需要替换的文本。可以通过g标志对行进行全局替换。注意下面第三行的A BC中A和B之间有个空格

 

sed -n 's/ABC/BCA/p' test_sed.txt 

 

输出:

 

BCA     Def     hIc     lmN     ABC

BCA     Def     hIc     lmN     dsf

A BC     Def     hIc     lmN     BCA

 

sed -n 's/ABC/BCA/gp' test_sed.txt

 

输出:

 

BCA     Def     hIc     lmN     BCA

BCA     Def     hIc     lmN     dsf

A BC     Def     hIc     lmN     BCA

 

说明:命令标志g表示在行内进行全局替换。也就是说某一行出现多个ABC都将被替换,如果没有g标志,则只将每行的第一个ABC替换。

 

sed -n 's/ABC$/BCA/gp' test_sed.txt

 

输出:

 

ABC     Def     hIc     lmN     BCA

A BC     Def     hIc     lmN     BCA

 

说明:替换只在行尾的ABC,虽然此处用了g标志,但是也不会替换处于行首的ABC

 

sed -n 's/^[0-9]{1,3}/&.00/p' test_sed.txt 

 

输出:

123.00     456     1.23    4.5     321

 

说明:当'&'符号用在替换串中时,它代表在查找串中匹配到得内容。上面的例子是在以3个数字开头的那三个数字后面添加".00",这个例子中的“&”代表“123”。

 

sed -n "s/That\('s\)/This\1/p" test_sed.txt 

 

输出:

This's  a       very    lovely  dog

 

说明:包含在圆括号里的“ 's ”作为标签1保存在特定的寄存器中,替换串可以通过“ \1 ” 引用它。这里将"that"替换为了"this"

 

注:当模式中使用了单引号模式的最外边最好用双引号,反之亦然。

 

sed -n "s#That\('s\)#This\1#p" test_sed.txt

 

输出:

This's  a       very    lovely  dog

 

说明:紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认是正斜杠(/),但可以改变。无论什么字符(换行符和反斜杠除外),只要是紧跟在s命令之后,就成了新的串的分隔符。这个在查找包含正斜杠的模式时很有用。例如查找路径或生日等。

 

sed -n "4,6s/Def/def/p" test_sed.txt

 

输出:

 

ABC     def     hIc     lmN     ABC

ABC     def     hIc     lmN     dsf

A BC     def     hIc     lmN     ABC

 

说明:将4至6行的Def替换为def,s前面用两个数字中间加一个逗号来界定要替换的范围。

 

 

 

 sed   "10s/^$/hello world/" test_sed.txt | cat -n   

 

输出:

 

    1  abc     def     hic     lmn     abc

     2  abc     def     hic     lmn     abc

     3  123     456     1.23    4.5     321

     4  ABC     Def     hIc     lmN     ABC

     5  ABC     Def     hIc     lmN     dsf

     6  A BC     Def     hIc     lmN     ABC

     7  You     are     a       good    boy

     8  you     are     not     a       good girl

     9  That's  a       very    lovely  dog

    10  hello world

 

 

说明:替换第10行的空行为hello world(相当于添加了一行),这种添加的好处是,可以用正则表达式,可以添加换行符(\n),制表符(\t)等。如(sed "10s/^$/\thello world\n/" test_sed.txt)下面的例4,例5也可以做添加和替换指定行,但是不能用正则和换行符等。

 

例4.指定行号替换:c

 

sed '4chello world' test_sed.txt | cat -n 

 

输出:

 

     1  abc     def     hic     lmn     abc

     2  123     456     1.23    4.5     321

     3  ABC     Def     hIc     lmN     ABC

     4  hello world

     5  A BC     Def     hIc     lmN     ABC

     6  You     are     a       good    boy

     7  you     are     not     a       good girl

     8  That's  a       very    lovely  dog

 

例5.添加:a i

 

sed '4ahello world' test_sed.txt | cat -n

 

输出:

 

     1  abc     def     hic     lmn     abc

     2  123     456     1.23    4.5     321

     3  ABC     Def     hIc     lmN     ABC

     4  ABC     Def     hIc     lmN     dsf

     5  hello world

     6  A BC     Def     hIc     lmN     ABC

     7  You     are     a       good    boy

     8  you     are     not     a       good girl

     9  That's  a       very    lovely  dog

 

说明:<行号>a<字符串> 在指定的<行号>后面添加指定的字符串,<行号>i<字符串>在指定的<行号>前面添加指定的字符串。

 

例6.指定行的范围:逗号

 

行的范围从文件中一个地址开始,在另一个地址结束。地址范围可以是行号(例如5,10)正则表达式(例如/ABC/,/You/)或两者的结合(例如:/ABC/,$)范围是闭合的包含开始条件的行,结束条件的行。如果结束条件无法满足就会一直操作到文件尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。

 

cat  test_sed2.txt

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     ABC

you     are     not     a       girl

ABC     Def     hIc     lmN     dsf

A BC     Def     hIc     lmN     ABC

abc     cde     acd     lll     des

You     are     a       good    boy

you     are     not     a       good girl

That's  a       very    lovely  dog

 

sed -n '/abc/,/you/p' test_sed2.txt 

 

输出:

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     ABC

you     are     not     a       girl

abc     cde     acd     lll     des

You     are     a       good    boy

you     are     not     a       good girl

 

说明:打印包含模式abc的行到包含模式you的行之间的行,如果abc出现在you之后的某一行,则打印的范围从abc所在行开始,到下一个出现you的行或文件尾(如果没有再出现包含模式you的行)

 

sed -n '2,/you/p' test_sed2.txt

 

输出:

 

123     456     1.23    4.5     321

ABC     Def     hIc     lmN     ABC

you     are     not     a       girl

 

说明:打印从2行开始到第一个以you结尾的行之间所有的行。

 

例7.多重编辑:e命令

 

-e命令是编辑命令,用于sed执行多个编辑任务的情况。在下一行开始编辑前所有的编辑动作将应用到模式缓冲区的行上。

 

sed -e '5,$d' -e 's/ABC/BCA/g' test_sed2.txt 

 

输出:

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

BCA     Def     hIc     lmN     BCA

you     are     not     a       girl

 

说明:-e命令用于多重编辑,第一重删除第5行到最后一行之间的所有行,第二重替换包含模式ABC的行的所有ABC为BCA,因为是逐行进行这两行编辑(即这两个命令都在模式空间的当前行执行),所以编辑命令的顺序会影响结果。例如,如果两个命令都是替换命令则前一次替换会影响后一次替换。

 

例8.将修改作用于文件:-i

 

sed -i '3,$d' test_sed2.txt 
cat test_sed2.txt 

 

输出:

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321

 

在文件末尾追加内容

sed -i '$a\hello world' test_sed2.txt

 

输出:

 

abc     def     hic     lmn     abc

123     456     1.23    4.5     321
hello world

 

上一篇:流编辑器sed(一)

下一篇:awk实用程序(一)

文章评论

  • 暂无评论

发表评论

昵称:

内容:

发表评论