UP | HOME

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. 替换标记
    s/pattern/replacement/flags
    

    有四种可用的替换标记:

    • 数字,表示替换第几处
    • g,表示替换所有
    • p,表明将原来行的内容打印出来(配合-n使用可只输出修改过的行)
    • w file,将替换的结果写入的文件中去
  2. 替换字符

    由于/经常出现在路径中,要替换的话必须要用\来转移,非常麻烦哦

    在sed中可以用其他字符来作为substitute命令中的分隔符,比如:

    sed 's!/bin/bash!/bin/zsh!' /etc/passwd
    

1.2.2 使用地址

sed有两种寻址方式:

  1. 行的数字范围
  2. 用文本模式来过滤出行

    命令各位可以为:[address]command

    也可以为

    address {
        command1
        command2
        command3
    }
    
  3. 数字寻址
    • 替换单行: \(sed '2s/dog/cat' file\)
    • 替换行范围: ` sed ‘2,$s/dog/cat’ file`
  4. 文本模式过滤

    格式为/pattern/command pattern可以为简单的文本匹配,也可以使用正则表达式

  5. 组合命令

    使用花括号将多条命令组合在一起。

    $ sed '2{
    > s/re/re1/
    > s/re2/re22/
    >}' data
    

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`

Author: Jonathan

Created: 2017-02-22 周三 10:37

Emacs 24.3.50.3 (Org mode 8.0.3)

Validate