Quantcast
Channel: CodeSection,代码区,Linux操作系统:Ubuntu_Centos_Debian - CodeSec
Viewing all articles
Browse latest Browse all 11063

Linux基础知识之sed流编辑器详解

$
0
0

之前介绍了三大文本编辑器的grep,这里介绍比grep功能更强的sed流编辑器

linux文本处理工具grep和正则表达式及egrep与grep区别 http://www.linuxidc.com/Linux/2016-08/134046.htm

sed是什么?

sed是Stream EDitor的缩写,man中对sed的简介为

sed - stream editor for filtering and transforming text

它的主要功能是对文本的过滤与替换。

sed的工作原理

sed的工作过程 :sed是一个流编辑器,所谓流编辑器是指sed每次只从文件或stdin中读入一行,将读入的行保存至模式空间然后根据指定的要求对其进行处理,并将处理后的结果输出至屏幕,接着读入下一行,整个文本的过程如流水线般被逐行处理后输出。

sed对内容的处理方式 :sed不是在原文件中或原输入上直接进行处理的,它将读入的行放入缓存区,对缓存区里的内容进行处理,处理完毕后默认不会写入或覆盖源文件,而是直接输出到屏幕上。

它有两个内存缓冲区分别叫做: 模式空间 (pattern space)、 保持空间 也有称作 暂存缓存区 (holding space)。

一般情况下sed首先把第一行装入模式空间,进行处理后输出屏幕,然后第二行装入模式空间替换掉模式空间里原来的内容,再进行处理,依次循环,直至结束。

下面是我对sed工作流程的理解图。


Linux基础知识之sed流编辑器详解

1、sed每次将stdin中的内容中的一行读入模式空间

2、之后根据模式空间中的匹配条件进行匹配,符合条件进入下一阶段即普通编辑,不满足则默认至标准输出,结束

3、普通编辑之后分三个阶段,1)普通编辑之后选择性显示至STDOUT,结束;2)进入holding space进行高级编辑,编辑结束后选择性显示至模式空间,之后再次根据编辑命令重复2-3过程;3)若是出现多编辑命令则需要再返回模式空间根据编辑条件再次进行2-3步骤。

限于个人理解程度上述的理解免不了跟真实的工作流程有些出入,大家要抱着质疑的态度去看,我写的不一定都是对的,不过错的应该不至于很多。

sed语法 sed OPTIONS ... < SCRIPT > [INPUTFILE...] [SCRIPT] :可以理解为地址定界加编辑命令。

常用选项 :

-n :不输出模式空间中的内容至屏幕;通俗点可以理解为它可以自动过滤掉模式空间中未匹配到的行,-n 要与命令编辑中的p合用(命令编辑见下文),用于显示模式空间中被匹配到的内容。

suppress automatic printing of pattern space

-n的具体应用见后面的sed编辑高级命令演示

-e :多点编辑

add the script to the commands to be executed

-f :每行一个编辑命令

add the contents of script-file to the commands to be executed

-r :使用扩展表达式

use extended regular expressions in the script.

-i :直接编辑原文件

edit files in place (makes backup if SUFFIX supplied)

SCRIPT :

之前对这块很迷糊,因为info中sed显示语法有[]表示可加可不加,于是就在sed后直接加想要编辑的文本

于是就出现如下情况

[root@localhosttest]#sedsed1 sed:-e表达式#1,字符4:未终止的“s”命令

报错信息没找到终止的限制条件,所以上面的sed语法格式并不准确。

通过实验,sed可以不加[OPTION]但是[SCRIPT]则必须添加

SCRIPT分两部分 : 地址定界 (用于限定编辑文本的范围)、 编辑命令 (用于对匹配到的内容进行什么样的操作或编辑),前者可少后者必不可少,如果没有编辑的命令会发生如下错误

[root@localhosttest]#sed'1'cat1 sed:-e表达式#1,字符1:遗漏命令 [root@localhosttest]#catcat1 hi,everyone nowIwillshowhowtousecat [root@localhosttest]#sed'p'cat1 hi,everyone hi,everyone nowIwillshowhowtousecat nowIwillshowhowtousecat

地址定界 :

1、空地址: 对全文处理 。

2、单地址:

# :指定行;

/pattern/:被此模式所匹配到的每一行;

3、地址范围:

#,# :从#开始到#结束的所有行

#,+# :从#开始向下至+#的行之间的所有行

#,/pat1 / 从#开始至匹配到第一次出现/pat1/模式的行之间的所有行

/pat1/,/pat2/ :第一次匹配到/pat1/的行到第一次匹配到/pat2/的行之间的所有行

4、步进:~

1~2 :所有奇数行 2~2 :所有偶数行

编辑命令 :若少了编辑命令会报错,编辑命令在SCRIPT中至少出现一次。

d :删除模式空间中匹配到的内容 Delete pattern space

a \text 在行后面插入文本“text”,支持使用\n实现多行插入

Append text, which has each embedded newline preceded by a back slash.

i \text 在行前面插入文本“text”,支持使用\n实现多行插入

Insert text, which has each embedded newline preceded by a back slash.

c\text 把匹配到的行替换为此处指定的文本“text”

Replace the selected lines with text, which has each embedded new line preceded by a backslash.

w filename 保存模式空间匹配的行至指定的文件中

Write the current pattern space to filename.

r filename 读取指定文件内容至当前文件被模式匹配到的行文件后合并

Append text read from filename.

= : 为模式匹配到的行打印行号 Print the current line number.

! : 条件取反( 它比较特殊,它必须跟其他编辑命令一起使用 )

s/regexp/replacement/ : 查找替换,其分隔符可自行指定,常用有s@@@,s###

它有一个特殊的用法s//x&/:表示将被查找的内容在其前面添加x内容

s//&x/:表示将被查找的内容在其后面添加x内容

&代表被查找的内容

[root@localhosttest]#catcat1 hi,everyone nowIwillshowhowtousecat [root@localhosttest]#sed's/e/&#/'cat1 hi,e#veryone nowIwillshowhowtouse#cat [root@localhosttest]#sed's/e/#&/'cat1 hi,#everyone nowIwillshowhowtous#ecat

p :显示替换成功的行

g :全局替换

w filename : 将替换成功的结果保存至指定文件中

查找替换在sed中应用很广,下面很多例子都是以sed的替换功能实现的

p :显示当前模式空间中的内容 Print the current pattern space.

注:同时使用多个编辑命令,命令之间要用;隔开(!除外) 例子如下: [root@localhosttest]#sed'p;='cat1 hi,everyone 1 hi,everyone nowIwillshowhowtousecat 2 nowIwillshowhowtousecat

实例演示 :

1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符 sed's#^[[:space:]]\+##'/etc/grub2.cfg

这里##是将前面匹配到的内容删除的意思,上面文本内容太多,就不截取了。

2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#号及#后面的所有空白字符 sed's@^#[[:space:]]\+@@'/etc/fstab [root@localhosttest]#cat/etc/fstab # #/etc/fstab #CreatedbyanacondaonTueJul1923:52:412016 # #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # /dev/mapper/CentOS-root/ xfs defaults 00 UUID=6efb8a23-bae1-427c-ab10-3caca95250b1/boot xfs defaults 00 /dev/mapper/centos-swapswap swap defaults 00 [root@localhosttest]#sed's@^#[[:space:]]\+@@'/etc/fstab # /etc/fstab CreatedbyanacondaonTueJul1923:52:412016 # Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # /dev/mapper/centos-root/ xfs defaults 00 UUID=6efb8a23-bae1-427c-ab10-3caca95250b1/boot xfs defaults 00 /dev/mapper/centos-swapswap swap defaults 00 3、在/etc/fstab每一行行首增加#号 cat/etc/fstab # #/etc/fstab #CreatedbyanacondaonTueJul1923:52:412016 # #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # /dev/mapper/centos-root/ xfs defaults 00 UUID=6efb8a23-bae1-427c-ab10-3caca95250b1/boot xfs defaults 00 /dev/mapper/centos-swapswap swap defaults 00 sed's@^@#&@'/etc/fstab # ## ##/etc/fstab ##Createdbyanacondao

Viewing all articles
Browse latest Browse all 11063

Trending Articles