不能不知道的 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 的优点有兴趣可以研究研究。