Sed是一种面向字符流的编辑器。处理文件时,sed把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾,一次只处理文件中一行的拷贝。文件内容并没有改变,除非你使用重定向存储输出。
Sed同时维护着模式空间(pattern space)和保持空间(hold space),可以将模式空间的内容复制到保持空间并在以后检索它们。
调用sed命令有两种形式
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
常用的options
-e command, --expression=command 允许多点编辑。
-n, --quiet, --silent 取消默认输出。
-f, --filer=script-file 引导sed脚本文件名
使用的基础command及示例
1 [address]s/pattern/replacement/flags ---substitution
用string替换正则表达式re。
以下的是替换标记flags
g表示行内全面替换。
p表示打印行。
w表示把行写入一个文件。
示例:sed -i 's/old/new/g' file GNU sed version 4.0.5以上带有-i选项
2 d [ a d d r e s s [,a d d r e s s ] ] d---delete
从模式空间(Pattern space)位置删除匹配行。
示例:
$sed '1d' quote.txt
It was an evening of splendid music and company.
Too bad the disco floor fell through at 23:00.
The local nurse Miss P.Neave was in attendance
$ sed '1,3d' quote.txt
The local nurse Miss P.Neave was in attendance.
$sed /^$/d 删除空行
3 追加 插入 更改
a ---append
在当前行后面加入一行文本。
i ---insert
在当前行上面插入文本。
c ---change
用新的文本改变本行的文本。它清除模式空间的内容,类似d命令的效果
append [line-address]a\
text
insert [line-address]i\
text
change [address]c\
text
4 l ---list
显示模式空间内容,将非打印的字符显示为两个数字的ascii码。
$ cat test/spchar
Here is a string of special characters: ^A ^B
^M ^G
$ sed -n -e "l" test/spchar
Here is a string of special characters: \01 \02
\15 \07
$ # test with GNU sed too
$ gsed -n -e "l" test/spchar
Here is a string of special characters: \01 \02
\r \a
5 y [address]y/abc/xyz/ ---Transform
按位置将abc中的每个字符转换成xyz中的
转换成大写
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
6 p ---print
打印模式空间的行。
=
打印被匹配行的行号。
q [line-address]q---quit
退出Sed。
7 n [address]n ---next
输出模式空间内容,然后读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。不返回脚本顶端。
附录:sed正则表达式元字符集
^
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\<
锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行。
\>
锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。