您的位置:首页 > 运维架构 > Linux

linux之sed用法之基础

2014-01-22 09:48 323 查看
sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法

sed命令行格式为:
sed [-nefri] ‘command’ 输入文本

常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。

-e∶直接在指令列模式上进行 sed 的动作编辑;

-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;

-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)

-i∶直接修改读取的档案内容,而不是由萤幕输出。

常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;

i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~

s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

举例:(假设我们有一文件名为ab)

删除某行

[root@localhost ruby] # sed '1d' ab #删除第一行 

[root@localhost ruby] # sed '$d' ab #删除最后一行

[root@localhost ruby] # sed '1,2d' ab #删除第一行到第二行

[root@localhost ruby] # sed '2,$d' ab #删除第二行到最后一行

  显示某行

. [root@localhost ruby] # sed -n '1p' ab #显示第一行 

[root@localhost ruby] # sed -n '$p' ab #显示最后一行

[root@localhost ruby] # sed -n '1,2p' ab #显示第一行到第二行

[root@localhost ruby] # sed -n '2,$p' ab #显示第二行到最后一行

  使用模式进行查询

[root@localhost ruby] # sed -n '/ruby/p' ab   #查询包括关键字ruby所在所有行

[root@localhost ruby] # sed -n '/^ruby/p' ab #查询包括关键字ruby所在起始的所有行

[root@localhost ruby] # sed -n '/ruby$/p' ab #查询包括关键字ruby所在结尾的所有行

[root@localhost ruby] # sed -n '/^$/=' ab   #查询‘空行’的所在行号

[root@localhost ruby] # sed -n '/^[[:space:]]*$/p' ab #查询内容为多个空格/tab组成的行

[root@localhost ruby] # sed -n '/\$/p' ab                  #查询包括关键字$所在所有行,使用反斜线\屏蔽特殊含义

  增加一行或多行字符串

[root@localhost ruby]# cat ab

Hello!

ruby is me,welcome to my blog.

end

[root@localhost ruby] # sed '1a drink tea' ab #第一行后增加字符串"drink tea"
Hello!

drink tea

ruby is me,welcome to my blog. 

end

[root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
Hello!

drink tea

ruby is me,welcome to my blog.

drink tea

end

drink tea

[root@localhost ruby] # sed '1a drink tea\nor coffee' ab #第一行后增加多行,使用换行符\n
Hello!

drink tea

or coffee

ruby is me,welcome to my blog.

end

  代替一行或多行

[root@localhost ruby] # sed '1c Hi' ab #第一行代替为Hi
Hi

ruby is me,welcome to my blog.

end

[root@localhost ruby] # sed '1,2c Hi' ab #第一行到第二行代替为Hi
Hi

end

  替换一行中的某部分

  格式:sed 's/要替换的字符串/新的字符串/g'
(要替换的字符串可以用正则表达式)

[root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g' #替换ruby为bird

  [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g' #删除ruby

插入

[root@localhost ruby] # sed -i '$a bye' ab #在文件ab中最后一行直接输入"bye"
[root@localhost ruby]# cat ab

Hello!

ruby is me,welcome to my blog.

end

bye

sed可以充当一个行过滤器(与管道相接,从管道上游获得输入),或者从文件中获取其输入。输出将被放入到标准输出流。sed 将输出中的行加载到模式空间(pattern space),对模式空间的内容应用
sed 编辑命令,然后将模式空间写入到标准输出中。Sed 可以在模式空间中组合多个行,然后它可能将输出写入到文件中、只写入选择的输出,或者根本不执行写入。

Sed 使用正则表达式语法在模式空间中搜索并有选择地替换文本,以及决定对哪些文本行应用编辑命令。保持缓存为文本提供了临时存储。保持缓存可以取代模式空间、被添加到模式空间,或者与模式空间进行互换。Sed 提供了一组有限的命令,但是这些命令结合了正则表达式语法和保持缓存,因而实现了某些非常令人吃惊的功能。sed 命令集常常被称为 sed
脚本。

举例说明sed的使用方法:

sed 's/a/A/' text1 #s命令表示替换,将text1每一行的第一个a替换为A

sed 's/a/A/g' text1 #加入g标记,表示将替换每一行的所有a

sed '2d;$s/a/A/g' text1 #2d表示删除第二行,;分隔了两个命令,第二个命令开始的$表示后续命令只操作最后一行

除了操作单独的行外(前面提到的$),sed 还可以操作一个行范围。行的起始和结束由一个逗号(,)分隔,并且可以被指定为行号、正则表达式或表示最后一行的美元符号($)。可以用大括号 { 和 } 对命令进行分组,使在大括号之间的命令只用于按范围选择的行。使用 -e 选项向脚本添加多个命令(实际上就是将命令分开,看起来更清楚,需要注意的事项是分隔开的地方不是任意的)。

sed -e '2,${' -e 's/a/A/g' -e '}' text1 #用-e选项来分段命令,2,$表明行范围,{}圈定行范围内的命令

sed -e '/pear/,/bana/{' -e 's/a/A/g' -e '}' text1 #/pear/,/bana/通过正则表达式指定行范围:从包含pear的行开始到包含bana的行结束(闭区间)

通过选项-f可以从文件读取命令

sed -f sedtab text1 #用sedtab文件中的字符串作为命令充当sed的命令对text1进行操作

sed '=' text2 #=命令输出行号,但是会将行号新起一行

sed '=' text2|sed 'N;s/\n//' #使用 N 命令将第二个输入行读取到模式空间,最后删除模式空间中两个行之间的换行符(\n)已经将不明白了,不得不看较全的sed教



参考地址:http://www.iyism.com/blog/post/239/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux sed