0%

sed命令使用

sed

stream editor 顾名思义为流编辑工具。通过正则表达式匹配到行,并进行相应处理,输出新行。用于自动编辑文件。

概要

1
sed 【OPTION】 ... {script-only-if-no-other-script} {input-file} ...

sed如何工作

sed维护两块内存空间,_pattern space 和 _hold space 初始都为空。

sed从输入流中读取一行,删除掉换行,然后把他放到_pattern space。然后执行各个命令。把_pattern space中的内容输出到输出流中,并添加换行符号,继续处理下一行,直到文件末尾。

使用

sed工具读取给定的文件,如果没有给定文件,读取标准输入。然后根据给定的一系列命令修改输入的内容。最后把修改内容输出到标准输出中。

一个单独的命令可以通过第一个参数传递给sed。 多个命令的话, 可以通过制定-e 或者-f选项设置。所有命令按顺序应用到输入。

选项

支持如下选项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-n, --quit, --silent 静默, 只输出匹配正则表达式的行,默认的所有行都会输出

-e script , --expression=script 添加一个脚本执行命令

-f script-file 从文件中读取命令添加到执行命令

--follow-symlinks 处理符号链接指向的文件,默认不处理

-i[SUFFIX] --inplace=SUFFIX 直接修改文件的内容,如果指定了后缀, 会把源文件重命名为以后缀结尾的文件,原始文件用来保存结果。
sed -e 's/123/xxx &/' -ib sed.md // 直接修改sed.md 同时备份内容到sed.mdb文件

-c 指定-i时,使用copy而不是重命名。

--posix disable all GNU extensions

-l N, --line-length=N 指定长行的换行, 0 表示从不为长行换行, 默认70

-r 指定正则表达式属于扩展正则表达式

Address Range

执行命令可以指定行,[address] commands

指定行的格式可以如下:

  • ‘NUMBER’, 指定特定行号
    sed ‘$p’ sed.md
  • ‘First~Step’,从第几行开始,每次跳跃Step行
  • ‘$’, 文件最后一行
  • ‘/REGEXP/‘, 匹配REGEX的行
  • ‘%REGEXP%’,匹配REGEX的行 %是分隔符
  • ‘Start, end’ 指定范围
    sed -ne ‘3,5p’ sed.md
    sed -ne ‘1,/888/p’ sed.md // 1-匹配888

正则表达式

  • ‘CHAR’ 匹配普通字符 ‘CHAR’
    • 匹配前一个字符0到多个
  • . 匹配任一字符
  • ^ 以什么开头
  • $ 以什么结尾
  • [LIST] 匹配LIST中的任一字符
  • [^LIST] 不属于LIST中的任一字符
  • REGEXP1|REGEXP2 匹配REGEXP1或者REGEXP2
  • REGEXP1REGEXP2 整串连续匹配REGEXP1, REGEXP2
  • \n 匹配换行

命令

  • ‘#’ 用来做注释的, 把命令写在文件中时使用, 用来注释

  • d 删除匹配的行 sed ‘/^$/d’ file

  • p 打印匹配的行 sed ‘3p’ file

  • {COMMANDS} 多个命令,使用分号分割

  • s 替换命令 s/REGEX/REPLACEMENT/FLAGS
    sed s/2/II/ sed.md
    sed s/1/I/1 sed.md
    sed s/1\2/I/ sed.md
    FLAGS:
    - g 替换所有匹配行
    - NUMBER 替换指定第几次匹配的行
    - p print new pattern space
    - w FILE_NAME 匹配的结果写入文件
    - r FILE_NAME 读取文件插入到匹配的行
    - & 前面匹配的字符 sed ‘s/222/xxx &/‘ sed.md

  • ! 表示命令对不匹配的行生效

命令最好使用单引号包含起来

返回值

执行成功返回0, 出错返回 >0

示例

1
2
3
4
5
6

sed -n '/[0-9]\{1,3\}/p' sed.md // 显示含有数字的行
sed -n -e '/.*inux/p' sed.md // 输出包含inux的行
sed -ne '/2\{1,3\}/p' sed.md
sed ‘s/^ *//‘ 删除前导空格
sed ’s/ *$//’ 删除行尾空格

以上是常用的一些命令, 还有许多其他命令,更多内容建议参考’man sed’

网络上有一篇博客写的挺详细的, 链接

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。