SED
Table of Contents
1 Sed基本使用笔记
sed为流编辑器,通过预先定义的规则来处理数据流。
1.1 命令选项
选项 | 描述 |
---|---|
-e script | 将script中指定的命令添加到运行的命令中 |
-f file | 将file中指定的命令添加到运行的命令中 |
-n | 不为每个命令生成输出,等待print命令输出 |
-i | 保存修改结果 |
- sed不对源文件进行修改,而是将处理结果输出到STDOUT上
- sed在命令行上运行多个命令是用-e选项,命令间用;分割,如:
sed -e 's/brown/green/;s/dog/cat/' file1
- 从文件中读取用-f参数,一行一个命令,不要;分割符号
1.2 基本使用
1.2.1 替换
1.2.2 使用地址
sed有两种寻址方式:
1.2.3 删除行
基本模式和替换差不多,只不过换成了d,而且后无替换内容。
值得注意的是在使用文本模式来删除某个范围的行时,指定的第一个模式会打开删除功能,第二个会关闭删除功能,如果找不到第二个模式,则一直删除到文件末尾。 如:
$ cat data Line1 Line2 Line1 Line3 $ sed '/1/,/2/d' data Line3
1.2.4 插入和附加文本
- 插入i,在指定行前增加一行
- 追加a,在指定行后增加一行
格式如下:
sed '[address]command\new line'
1.3 高级用法
1.3.1 保持空间
模式空间是一块活动缓冲区,另一块缓冲区域为保持空间。
命令 | 描述 |
---|---|
h | 将模式空间复制到保持空间 |
H | 将模式空间附加到保持空间 |
g | 将保持空间复制到模式空间 |
G | 将保持空间附加到模式空间 |
x | 交换模式空间与保持空间的内容 |
1.3.2 跳转
[address]b [label] 如果没有label则默认跳到文件结尾,标签格式为:label 实例:
sed '{/first/b jump1 ; s/test/test1/ > :jump1 > s/test/test2/}'
1.3.3 测试
[address]t [label] 与t的区别在于,只有匹配成功后才跳转。
1.3.4 模式替代
用&符号代替预定义模式的文本,比如:
$ echo "I am jonathan" | sed 's/.onathan/"&"/g' I am "jonathan"
1.4 实用功能
1.4.1 加倍行间距
`sed ‘G’ data2//末尾也加空行`
`sed ‘$!G’ data2 //末尾不加空行`
`sed ‘/^$/d;$!G’ data //先删除所有空行,然后加倍行距` PS: 保持空间默认是一个空行,所以把保持空间附加到模式空间后即可加倍行距
1.4.2 添加行号
`sed ‘=’ data | sed ‘N; s/\n/ /’`
1.4.3 打印末尾行
sed '{ > :start > $q > N > 11,$D > b start > }' /etc/passwd
1.4.4 删除连续空白行
`sed ‘.,/^$/!d’ data`
区间开始地址会匹配任何含有一个字符的行,区间的结束地址会匹配一个空行。
1.4.5 删除开头空白行
`sed ‘.,$!d’ data`
1.4.6 删除末尾空白行
sed '{ > :start > /^\n*$/{$d; N; b start} }' data
1.4.7 删除HTML标签
`sed ‘s/<[^>]*>//g;/^$d’ data`