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空间执行替换操作。
givh79_163.com 2018-7-23 10:41