13.1 sed编辑器
sed编辑器是一种流编辑器,每次从输入读取一行数据,将该数据与所提供的编辑器命令进行匹配,根据命令修改数据并输出到STDOUT。,重复上述过程,直到处理完全部数据。从上述过程可知,sed只读取数据流一次,因而比交互式编辑器快得多。
13.2 sed使用
13.2.1 格式
sed options script file,其中options表示命令选项,script表示对数据处理的命令,file表示要处理的数据,如果file参数为空,则将STDIN作为输入。
选项 | 描述 |
-e script | 将脚本中指定的命令添加到处理输入时执行的命令中 |
-f file | 将文件中的命令加入处理命令中 |
-n | 不需要为每个命令产生输出,但要等待打印命令 |
13.2.2 一般用法
(1)在命令中使用
echo "test sed" | sed 's/sed/SED/'
(2)在命令行中使用多个命令
echo "test sed" | sed -e 's/test/Test/; s/sed/SED/'
不同命令间用;分割,;后面保留一个空格,处理命令使用单引号'包围,同时使用-e命令选项说明要执行多条命令。
(3)从文件读取命令
sed -f script_file data_file
使用-f命令选项说明要执行的命令来自文件,script_file表示脚本保存的文件,data_file表示数据保存的文件。
13.2.3 常用命令
(1)替换标记
s/pattern/replacement/flags
flags有4种:数字(表示替换的位置)、g(表示全部)、p(表示打印原始行)、w file(将替换结果写入文件),默认情况下(不设置flags)替换第一个。
(2)使用地址
address command
sed '2s/dog/cat/' data,表示替换第二行
sed '2,3/dog/cat/' data,表示替换第二、三行
sed '2,$/dog/cat/' data,表示替换第二行及之后的全部行
(3)使用文本模式筛选器
/pattern/command
sed '/pattern/s/bash/csh/' data,表示替换包含pattern的行,可以使用正则表达式
(4)删除行
删除行并不会真的删除,仅从sed编辑器输出中删除。
sed 'd' data,删除全部行
sed '2,3d' data,删除第2、3行
sed '/pattern/d' data,删除匹配pattern的行
(5)插入、附加和更改
sed 'address command' data
插入:i,在指定行前插入
附加:a,在指定行后附加
更改:c,替换指定行内容
(6)变换命令
y,替换指定字符
sed 'y/123/789/' data,将data中的1->7,2->8,3->9
(7)打印
打印行,sed 'p'
打印匹配行,sed -n '/pattern/p' data
打印行号,sed '=' data
列出行,将不可打印的ASCII字符使用八进制表示,sed -n 'l'
(8)文件读写
写文件:sed '1,2w test' data
读文件:sed '3r data2' data,sed编辑器在该地址之后插入文件中的文本
13.3 高级sed编程
13.3.1 多行命令
(1)next命令
单行next命令(n),sed '/header/{n; d}' data,删除包含header行的下一行
多行next命令(N),将header行和下一行合并,虽然仍包含换行符,但是sed表及其将它们作为一个文本行处理。
(2)多行删除命令
单行删除命令(d),sed ‘N; /System\nAdministrator/d' data,删除模式空间中的两行。
多行删除命令(D),sed ‘N; /System\nAdministrator/D' data,只删除第一行,删除直到换行符的所有字符。
(3)多行打印命令
单行打印命令(p),sed ‘N; /System\nAdministrator/p' data,打印模式空间中的两行。
多行删除命令(P),sed ‘N; /System\nAdministrator/P' data,只打印第一行。
13.3.2 保留空间sed编辑的空间是模式空间,还存在保留空间的缓冲区,可用于在模式空间中存在其他行时暂时保存问本行。
命令 | 描述 |
h | 将模式空间复制到保留空间 |
H | 将模式空间追加到保留空间 |
g | 将保留空间复制到模式空间 |
G | 将保留空间追加到模式空间 |
x | 将模式空间和保留空间的内容交换 |
13.3.3 否定命令
13.3.4 更改命令流