原创 对sed命令的练习

2018-7-19 15:09 2406 23 2 分类: 软件与OS 文集: Linux笔记

sed是流编辑器。它每次处理一个输入,因此很有效率。官方手册:

https://www.gnu.org/software/sed/manual/sed.html


学习Linux命令,当然要阅读官方手册,所以本文不再对sed的使用方法做说明,而是以练习为主。

sed命令是非常强大的,so,我开始啦~


练习1. 将标准输入流的"hello"替换成"HELLO"

答:$ sed 's/hello/HELLO/'  # 或者 

$ sed 's/hello/HELLO/' -

sed是流编辑器,如果没有给它文件名做参数,或者连在管道后,它会读取标准输入流。

如果要简单的测试sed的功能,使用标准输入流非常方便。


* 如果加上-i参数,则sed会修改源文件,且不会在标准输出里打印。

* 如果加上-n参数,则sed会打印指定行,而不是所有行。打印的行由脚本里的p参数决定。

* sed会默认将后面跟着的多个文件名,组合成一个流。如果加上-s参数,则把每个文件单独对待。

* -e参数用来指定脚本位置,如果没有它,则脚本是非option的第一个参数。

* -f参数用来指定脚本所在的文件。我们可以把脚本存放在文件里,然后通过-f参数获取。


练习2. 将三个文件里的"hello"替换成"HELLO",并分别保存备份

答:$ sed -i.bak 's/hello/HELLO/' FILE FILE1 FILE2

-i参数后面带的字符串,表示备份文件的后缀。

-i和-n参数的配合,尤其要非常谨慎。


* sed有不同的返回值,0表示成功,非0表示有错误。用户可以指定返回值。


练习3. 删除文件的30到35行

答:$ sed '30,35d' FILE


练习4. 找到文件中的"HELLO"字符串并退出

答:$ sed '/^HELLO/q' FILE


练习5. 找到文件中的"HELLO"并删除,并将a替换成A

答:$ sed '/^HELLO/d ; s/a/A/' FILE


* addr可以是行号,也可以是正则表达式。

* 分号用来隔开两个连续执行的脚本,使用-e或者-f参数组合起来也行。


练习6. 分析下面这个脚本的含义:s/\(b\?\)-/x\u\1/g

答:s表示替换命令,g表示替换pattern里所有的匹配项。

\(b\?\)-是正则表达式,去掉转义符\,表示成(b?)-。?表示匹配前一字符0或1次。

x是被用来替换的字符串。

u表示将小括号内的第一个字母变成大写。

1表示u仅仅作用于第一个小括号,如果有两个小括号,就可以指定为1或者2。


练习6. 分析下面这个脚本的含义:s/\(b\?\)-/\u\1x/g

答:s表示替换命令,g表示替换pattern里所有的匹配项。

\(b\?\)-是正则表达式,去掉转义符\,表示成(b?)-。?表示匹配前一字符0或1次。

x是被用来替换的字符串。

u表示将小括号内的第一个字母变成大写。

1表示u仅仅作用于第一个小括号,如果有两个小括号,就可以指定为1或者2。


* sed是流编辑器,默认按行处理。

* sed可以指定address,比如只处理第n行,或者匹配的某些行。


练习7. 如果文件的某行包含apple,那么就将此行的hello替换成world

$ sed '/apple/s/hello/world/'


练习8. 如果文件的某行不包含apple,那么就将此行的hello替换成world

$ sed '/apple/!s/hello/world/'


* 对于sed来说,基础正则表达式的特殊字符,需要使用转义字符\。

* 对于sed来说,扩展正则表达式的特殊字符,不能使用转义字符\。


练习9. 找出文件中不以空格或tab开头的行

$ sed -n '/^ \|^\t/!p' FILE


练习10. 找出文件中在每行开头,且格式为xox的字符串,比如bob、mom、non等

$ sed -n '/^\(.\)o\1$/p'


* back-reference,正则表达式里的反向引用,使用'\n'的形式,用于引用小括号内的正则表达式。

* sed维护两个buffer,一个是当前活动模板空间,一个是辅助保持空间。首先,sed读取一行,去掉trailing符号,放置在当前模板空间。然后,执行命令,命令可以附带地址。最后,给当前活动空间增加trailing符号,打印到终端上。


练习11. 分析下面这个命令的含义:$ seq 6 | sed -n 'N;l;D'

答:sed首先会读取一行,第一行是1;

然后N会在当前行后添加trailing,再读取下一行;

l会unambiguously打印当前活动空间,如果有'\n',则打印出‘\n’,而不是另起一行。

D将当前活动空间的内容删除,只留下最新读取的这行,也就是2。

重新开始循环。


练习12. 分析下面这个命令的含义:$ sed '/./{H;$!d} ; x ; s/REGEXP/REPLACEMENT/'

答:首先,/./{H;$!d}会找到非空行,加入到当前的holding space里,除了保留最后一行的pattern空间外,删除其他行的pattern空间,重新开始循环。

然后,遇到了空行。x获取holding空间的内容。

最后,s对整个holding空间执行替换操作。


文章评论1条评论)

登录后参与讨论

givh79_163.com 2018-7-23 10:41

好!
相关推荐阅读
DiracFatCat 2018-09-05 12:14
【博客大赛】卡尔曼滤波学习笔记(11)从位置估计速度
卡尔曼滤波器,不仅仅是一个低通滤波器,否则也不会持续发展50年。 示例:桑先生需要测试高速列车的性能。测试的目的是判断列车在直线上能否保持80m/s的速度。速度和位置每0.1秒测量一次,但是由于...
DiracFatCat 2018-08-31 19:32
【博客大赛】卡尔曼滤波学习笔记(10)一个简单的示例
《Kalman Filtering: Theory and Practice Using MATLAB》第三章,看不懂,暂时略过。《Kalman Filtering: Theory and Pract...
DiracFatCat 2018-06-19 15:10
【博客大赛】卡尔曼滤波学习笔记(八)可观测性和可控制性 ...
可观测性是指,在给定模型的情况下,动力学系统的状态是否由它的输入输出唯一确定。可观测性是系统模型的特征。如果传感器矩阵H是可逆的,则本系统可观测,因为有:如果传感器矩阵H某些时候是不可逆的,则本系统仍...
DiracFatCat 2018-06-19 10:56
【博客大赛】卡尔曼滤波学习笔记(七)Z变换
如果我们仅仅对离散线性系统感兴趣,那么就使用下面这个表达式:如果u是常量,那么可以写成:为了简化表达式,我们可以将上面写成:离散线性时不变系统的Φ求解,可以使用Z变换。(* 由于本人已经忘记了Z变换的...
DiracFatCat 2018-06-19 10:54
【博客大赛】卡尔曼滤波学习笔记(六)拉普拉斯变换
对于线性时变/时不变系统,求解Φ(t)有多种方式,拉普拉斯变换是其中一种。(* 由于本人已经忘记了拉普拉斯变换的内容,因此本节待续。)...
EE直播间
更多
我要评论
1
23
1
2
3
4
5
6
7
8
9
0
关闭 站长推荐上一条 /6 下一条