女主宣言:
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 - 整理文章
这个例子涉及到的点挺多的,如果能学会基本这个文章里面的东西就都学会了。 蛤蟆没事喜欢写点小说,能从哪里看到呢?这是后话再说还没有发表,我们说一下这里面会遇到的问题。
-
在刚开始的时候就是小说的最前面,写了一些人物设定和大纲,但是这个不希望普通用户看到,需要删了
-
还有在有的地方用到了注释,单行注释// 独占一行可能是一行的结尾,也是需要删除掉的
-
蛤蟆的中文的标点是英文下的标点,这样在敲代码的时候标点就可以直接敲出来不用再切换了,所以需要把所有的英文的标点改成中文的
-
写的时候没有空行,但是为了排版漂亮需要在每章节的前后留一个空行,每章是固定格式是 “第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 的优点有兴趣可以研究研究。