stream editor 顾名思义为流编辑工具。通过正则表达式匹配到行,并进行相应处理,输出新行。用于自动编辑文件。
概要
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选项设置。所有命令按顺序应用到输入。
选项
支持如下选项:
-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
示例
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
github博客: fishmwei.github.io/