sed(stream editor)命令是一个面向字符流的非交互式编辑器,是按行来处理文本内容的;它还能配合管线来使用,非常高效
我之所以想学会使用这个命令,是因为:当同一个长文本每次执行只需要修改一个小地方时,使用sed能直接对文本操刀,避免使用复杂的python文本生成来覆盖原文本,配合bash脚本使用简直美滋滋
需要注意的另一个点是:可以先使用sed确保命令本身没问题,再使用-i
选项直接修改文本(不使用-i
选项,执行sed命令后原文本文件不会被修改)
sed [选项] {动作或脚本命令, 如果没有其他脚本的话} 文本文件名
1. 常用选项
-n
: 安静模式,只打印被修改了的行-e <script>
: 使用选项中指定的script来处理输入的文本文件-f <script文件>
: 使用选项中指定的script文件来处理输入的文本文件-r
: 在动作中使用扩展的正则表达式(默认是基础正则表达式,比如使用限定符会无效等)-i
: 直接对文本文件操刀,而不是打印结果到终端--follow-symlinks
: 保持软连接文件的连接,硬连接没招儿--version
: 打印版本信息
2. 常用动作
p
: 列出选中的行a
: 在指定行后面追加文本i
: 在指定行前面插入文本d
: 删除指定的行c
: 用新文本替换掉选中的行s/正则表达式或指定文本/新文本/
: 用新文本替换匹配到的内容,最后加g
表示全部替换,否则只替换每一行的第一个匹配内容。而实际上/
在这里只是分隔符,s
后面紧接着的就是分隔符,可以用别的符号代替,例如#
或@
等(亲测)。
一般脚本命令前面会加指定行区间,比如加2
表示只对第2行进行操作,2,$
表示对第2行至最后一行进行操作等
3. 实例
原文本内容:
ubuntu@ubuntu:~$ cat test
hello linux!
i have 10 apples.
i have no idea for this file.
233333
增加行
ubuntu@ubuntu:~$ sed '3a\add newline after 3rd line.' test
hello linux!
i have 10 apples.
i have no idea for this file.
add newline after 3rd line.
233333
ubuntu@ubuntu:~$ sed '3i\add newline before 3rd line.' test
hello linux!
i have 10 apples.
add newline before 3r