不能不知道的 Linux 文本编辑神器_sed

 

女主宣言:

linux 下有很多的操作都是对文本进行操作的,如果经常和文本打交道(coding、分析log)。那就不得不说 Sed 和 AWK。现在我们就简单的介绍一下 Sed 的一些用法。

PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

 

sed 介绍

 

sed是stream editor(流编辑器)的简称。他对文件流进行编辑,操作的对象是标准输入或者指定的一系列的文件。

 

主要是分为3个方面的介绍:

第一个是行的选择,就是选择哪些行。

第二个是几个常用选项。

第三个是一些sed的基础命令,最后有综合的几个例子。

 

sed 选择行

 

行选择(三类)

 

1. 单个的

命令 解释
n 行号,n是正整数
$ 最后一行
/regexp/ 支持的是POSIX的基本正则表达式的文本行。如果多行都匹配那么就表示多行

 

2. 需要两个参数表示的

命令 解释
addr1,addr2 从addr1到addr2范围内的行,包含地址addr2在内
first~step 匹配数字first所指的行,随后的每隔step的行
addr1,+n addr1指定的行和随后的n行

 

注意: 这里的addr*可以用上面的数字或者是正则或者是$来表示的。

 

3. 取反

命令 解释
addr! 匹配所有的除了addr的行

 

注意: addr可以是上面的1和2的任意一种。

 

sed 选项

 

-n -e -f 选项分别是什么意思

-n不默认打印

 

sed 默认到了最后一条命令的时候会把模式空间里面的内容(就是处理后的结果)打印出来。

 

但是有的时候我们并不需要打印所有的这个时候就可以配合-n p命令自己手动决定要打印出来哪些行。

 

如果是把命令写到了一个文件运行的时候,如果第一行#n那么和-n选项一样的。 

 

-e:如果有多个命令可以用-e来指定,只有一个的时候可以省略。

-f :从文件读取命令运行

 

如果有很多的操作可以写到文件里面。

 

sed 基础命令

 

 

命令 (三组)

 

1. 单个的命令

命令 释义
q 退出sed不再处理更多的文本行,行为是会使sed停止读取新的输入行,并停止将它们发送到输出。
d 删除当前行
p 打印行

 

2. 需要加一个参数

命令 释义
i 在行之前插入内容
a 在行后插入内容
c 把选中的行替换一次

 

3. 需要加2个参数

命令 释义
s/regexp/replacement/[flag] 把 regexp 替换成后面的
y/set1/set2/ 把set1中替换为set2中对应的

 

s中的:replacement可以用&表示所有的匹配\1表示匹配的子模式的第一个。flag可以n用1-512表示,替换当前行出现的第n个,如果是g那么替换全部。

 

y不同于tr程序,sed要求两个字符集合有相同的长度。

 

 

例子1 - 模拟 head

取文件的前十行:sed '10q' sed.md

这个意思是从第一行开始一直到第10退出,中间没有什么操作,在命令的结束会默认打印当前行,结果就是和head一样的。

 

 

例子2 - 整理文章

这个例子涉及到的点挺多的,如果能学会基本这个文章里面的东西就都学会了。 蛤蟆没事喜欢写点小说,能从哪里看到呢?这是后话再说还没有发表,我们说一下这里面会遇到的问题。

 

  1. 在刚开始的时候就是小说的最前面,写了一些人物设定和大纲,但是这个不希望普通用户看到,需要删了

     

  2. 还有在有的地方用到了注释,单行注释// 独占一行可能是一行的结尾,也是需要删除掉的

  3. 蛤蟆的中文的标点是英文下的标点,这样在敲代码的时候标点就可以直接敲出来不用再切换了,所以需要把所有的英文的标点改成中文的

  4. 写的时候没有空行,但是为了排版漂亮需要在每章节的前后留一个空行,每章是固定格式是 “第xxx章”

  5. 调整每段的缩进,就是前面空两行,但是标题行不空

  6. 顺便给最后一行插入一个空行

     

 

[ ~]$ cat a.txt

这里是写的大纲

 

人物一: 大白

人物二: 小黑

第一章 那山

//下面的是第一章一定引人入胜

从前有座山,山上有个老和尚和一个小和尚,还有一个小和尚.哈哈......//这个开头厉害吧!哈哈...

第二章 那庙

还是那座山,还是那个庙。

/*

能不能换一个庙啊

*/

这一天老和尚和小和尚去另一个庙里拜访另外一个师傅。// 要不咱们还是说说刚才的那个庙

 

[ ~]$ sed -f sed.sed a.txt

第一章 那山

 

    从前有座山,山上有个老和尚和一个小和尚,还有一个小和尚。哈哈……

 

第二章 那庙

 

    还是那座山,还是那个庙。

    这一天老和尚和小和尚去另一个庙里拜访另外一个师傅。

 

 

[ ~]$ cat sed.sed

 1,/第.*章/{

    /第.*章/!d

}

/^\/\//d

/\/\/.*$/s/\/\/.*$//

s/\.\.\.\.\.\./……/

s/\.\.\./…/

y/,./,。/

/第.*章/!s/^/    /

/第.*章/a

/第.*章/i

/\/\*/,/\*\//d

$a

[ ~]$

 

我们来看看上面的这个脚本是什么意思

  • 首先我们把从第一行到第一个第xx章除了第xx章其余的行删除了

  • 删除//开头的行

  • 删除//到结尾的著述

  • 把六个.替换为省略号

  • 替换三个.为三个中文的

  • 替换英文的逗号句号为中文的

  • 给正文加缩进

  • 在章节前后各加一个空行

  • 删除多行注释

  • 最后一行后面追加一个空行

     

模式空间

 

介绍一下模式空间,sed每次会读取一行放入到模式空间里面,然后依次运用命令,到最后一行了输出模式空间的内容,并清空。

 

接着读取下一行内容到模式空间就这样一直进行下去直到末尾。我们看到前面的-n选项可以阻止默认的最后的打印行为,而p可以打印模式空间的内容但是不清空。

 

高级命令还有很多可以操作多行和对模式空间的另类操作。有兴趣的可以看看《sed与awk》这本书写的不错。

 

这篇文章只是抛砖引玉,希望大家可以看到 sed 的优点有兴趣可以研究研究。

不能不知道的 Linux 文本编辑神器_缩进_02