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

雪天蛤蟆跳跳 360云计算

女主宣言:

linux 下有很多的操作都是对文本进行操作的,如果经常和文本打交道(coding、分析log)。那就不得不说 Sed 和 AWK。现在我们就简单的介绍一下 Sed 的一些用法。 PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!

sed 介绍

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

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

第一个是行的选择,就是选择哪些行。 第二个是几个常用选项。 第三个是一些sed的基础命令,最后有综合的几个例子。

sed 选择行

行选择(三类)

1. 单个的

2. 需要两个参数表示的

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

3. 取反

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

sed 选项

-n -e -f 选项分别是什么意思 -n不默认打印

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

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

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

-e:如果有多个命令可以用-e来指定,只有一个的时候可以省略。 -f :从文件读取命令运行

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

sed 基础命令

  • 命令 (三组)

1. 单个的命令

2. 需要加一个参数

3. 需要加2个参数

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

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

  • 例子1 - 模拟 head 取文件的前十行:sed '10q' sed.md

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

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

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

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

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

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

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

  • 顺便给最后一行插入一个空行

[ ~]$ 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 的优点有兴趣可以研究研究。