首页 > CentOS > 文本处理三剑客之剑二 ———–sed流编辑器
2016
03-09

文本处理三剑客之剑二 ———–sed流编辑器

grep、sed和awk在Linux/Unix系统中并称为文本处理三剑客(结合正则表达式使用);

一、什么是sed?    

sed是非交互式文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以是来自键盘输入、文件重定向、字符串、变量,甚至来自管道的文本。它是流式编辑器。

二、sed的工作过程:

sed从文本的一个文本行或标准输入中读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此命令要求的行号进行编辑,重复此过程,直到命令行或脚本中的所有命令执行完毕。

三、特点:

相对于其他的文本编辑sed具备以下让人难以拒绝的特点;

1、 非交互式,基于模式匹配的过滤及修改文本。

2、逐行处理,所以对舒适的交互式编辑而言太大的文件使用sed会显得 十分高效

,为用户节省了大量的时间。

3、可实现对文本的输出、删除、替换、复制、剪切、导入、导出等各种编辑操作。

4、脚本化,在shell脚本编辑中vim需要通知处理文件的哪几行才会去处理,而sed默认会处理文件的所有行。

5、sed只对缓冲区(模式空间)中原始文件的副本进行编辑,不编辑原文件。如果要把编辑后的内容保存,可以将输出重定向输出到另一个文件。

四、sed适用于以下三种场合

1、编辑相对交互式文件编辑器而言太大的文件

2、编辑命令太复杂,在交互式文本编辑器中难以输入的情况

3、对文件扫描一遍,但是需要执行多个编辑函数的情况

五、sed 相关使用详解:

1、语法格式:sed [OPTION]… {script-only-if-no-other-script} [input-file]…

        OPTION—-选项

script—–地址定界编辑命令

input-file—-输入文件

  2、选项[OPTION]:

(1)、常用选项:

-n:不输出(模式空间)中的内容到标准输出(显示屏);

sed  -n ‘1p’ input

-e:多点编辑(-e script),表示将下一个字符串解析为sed编辑命令。如果只传送一个命令给sed时,-e 可以省略;

sed  -e ‘1p/p’  -e  ‘1p/=’input

-f:表示正在调用sed脚本文件(-f  /PATH/TO/SED_SCRIPT_FILE),每行一个编辑命令。

例如:脚本append.sed脚本演示sed追加文本方法

#!/bin/sed -f

/file:/a\                  a\表示此处换行添加文本

-r:从文本中读取文本,支持扩展正则表达式;

echo “aa bb” | sed -r ‘s/(.)/a/’            如果不加-r时,后面的()符号要转义

-i:在定位行号之前直接编辑原文件。

sed  -i ‘s/inn/out/g’ test.txt

(2)、地址定界:

sed命令通常由定位文本行和sed编辑命令两部分组成;

使用行号,指定一行,或指定行号范围

使用正则表达式

1)、空地址:对全文进行处理

2)、单地址:

x:代表指定行号;

/pattern/:查看包含模式的行,或此模式匹配到的行

3)、地址范围:

x,y:指定x到y的行号范围内

x,+y:指定x,到后面y行范围

x,/pattern/:从x号行到与/pattern/的匹配行之间的行

/patter/pattern/:查询包含两个模式的行

$:最后一行

4)、步进:~

1~2:匹配所有奇数行

2~2:匹配所有的偶数行

                 (3)、地址定界:

d:删除,删除所匹配到的行(后面一般不接什么)

p:列印,显示模式空间中的内容(通常与sed -n 一起出现)

a\text:新增,text为字串,这些字串会在新增到下一行出现

i\text :插入,text为字串,这些字串会在新增到上一行出现

c\text:替换 ,text为字串 ,这些字串可以取代n1,n2之间的行

s///:查找替换,可以直接进行替换,通常结合正则表达式 法,

其分隔符可自行指定,常用的有s@@@, s###等

g:全局替换;

w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;

p:显示替换成功的行;

六、sed 实例:

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

 删除某行
[root@localhost gayj] # sed ‘1d’ ab              #删除第一行
[root@localhost gayj] # sed ‘$d’ ab              #删除最后一行
[root@localhost gayj] # sed ‘1,2d’ ab           #删除第一行到第二行
[root@localhost gayj] # sed ‘2,$d’ ab           #删除第二行到最后一行

显示某行
[root@localhost gayj] # sed -n ‘1p’ ab           #显示第一行
[root@localhost gayj] # sed -n ‘$p’ ab           #显示最后一行
[root@localhost gayj] # sed -n ‘1,2p’ ab        #显示第一行到第二行
[root@localhost gayj] # sed -n ‘2,$p’ ab        #显示第二行到最后一行

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

增加一行或多行字符串
[root@localhost gayj]# cat ab
Hello!
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed ‘1a drink tea’ ab  #第一行后增加字符串”drink tea”
Hello!
drink tea
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed ‘1,3a drink tea’ ab #第一行到第三行后增加字符串”drink tea”
Hello!
drink tea
gayj is me,welcome to my blog.
drink tea
end
drink tea
[root@localhost gayj] # sed ‘1a drink tea\nor coffee’ ab   #第一行后增加多行,使用换行符\n
Hello!
drink tea
or coffee
gayj is me,welcome to my blog.
end

代替一行或多行
[root@localhost gayj] # sed ‘1c Hi’ ab                #第一行代替为Hi
Hi
gayj is me,welcome to my blog.
end
[root@localhost gayj] # sed ‘1,2c Hi’ ab             #第一行到第二行代替为Hi
Hi
end

替换一行中的某部分
格式:sed ‘s/要替换的字符串/新的字符串/g’   (要替换的字符串可以用正则表达式)
[root@localhost gayj] # sed -n ‘/gayj/p’ ab | sed ‘s/gayj/bird/g’    #替换gayj为bird
[root@localhost gayj] # sed -n ‘/gayj/p’ ab | sed ‘s/gayj//g’        #删除gayj

插入
[root@localhost gayj] # sed -i ‘$a bye’ ab         #在文件ab中最后一行直接输入”bye”
[root@localhost gayj]# cat ab
Hello!
gayj is me,welcome to my blog.
end
bye

删除匹配行

sed -i ‘/匹配字符串/d’  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)

  替换匹配行中的某个字符串

sed -i ‘/匹配字符串/s/替换源字符串/替换目标字符串/g’ filename

最后编辑:
作者:李国庆
这个作者貌似有点懒,什么都没有留下。
捐 赠如果您觉得这篇文章有用处,请支持作者!鼓励作者写出更好更多的文章!

留下一个回复

你的email不会被公开。