Sed 是一个流编辑器,这份 sed 速查表包含 sed 命令和一些常用的 sed 技巧。
语法
$ sed [选项] 命令 [输入文件]
使用管道
$ cat report.txt | sed 's/Nick/John/g'
$ echo '123abc' | sed 's/[0-9]+//g'
选项 | 示例 | 描述 |
---|---|---|
-i |
sed -ibak 's/On/Off/' php.ini | 备份并直接修改输入文件 |
-E |
sed -E 's/[0-9]+//g' input-file | 使用扩展正则表达式 |
-n |
sed -n '3 p' config.conf | 禁止默认模式空间打印 |
-f |
sed -f script.sed config.conf | 执行 sed 脚本文件 |
-e |
sed -e 'command1' -e 'command2' input-file | 执行多个 sed 命令 |
$ echo "hello world" | sed -e 's/h/H/g' -e 's/w/W/g'
Hello World
使用 -e
执行多个 sed 命令
$ echo 's/h/H/g' >> hello.sed
$ echo 's/w/W/g' >> hello.sed
$ echo "hello world" | sed -f hello.sed
Hello World
使用 -f
执行 sed 脚本文件
命令 | 示例 | 描述 |
---|---|---|
p |
sed -n '1,4 p' input.txt | 打印第 1-4 行 |
p |
sed -n -e '1,4 p' -e '6,7 p' input.txt | 打印第 1-4 行和第 6-7 行 |
d |
sed '1,4 d' input.txt | 打印除第 1-4 行外的所有行 |
w |
sed -n '1,4 w output.txt' input.txt | 将模式空间写入文件 |
a |
sed '2 a new-line' input.txt | 在指定行后追加行 |
i |
sed '2 i new-line' input.txt | 在指定行前插入行 |
命令 | 描述 |
---|---|
n |
打印模式空间,清空模式空间,并读取下一行 |
x |
交换模式空间与保持空间的内容 |
h |
将模式空间复制到保持空间 |
H |
将模式空间追加到保持空间 |
g |
将保持空间复制到模式空间 |
G |
将保持空间追加到模式空间 |
另请参阅:文件行距
$ sed 's/old/new/[标志]' [输入文件]
标志 | 描述 |
---|---|
g |
全局替换 |
1,2... |
替换第 n 次出现的内容 |
p |
仅打印被替换的行 |
w |
仅将被替换的行写入文件 |
I |
搜索时忽略大小写 |
e |
在命令行中替换并执行 |
命令 | 描述 |
---|---|
b 标签 |
跳转到标签(用于循环) |
t 标签 |
仅在成功替换后跳转到标签 (用于循环) |
:标签 |
b 和 t 命令的标签(用于循环) |
N |
将下一行追加到模式空间 |
P |
打印多行模式中的第一行 |
D |
删除多行模式中的第一行 |
标志 | 描述 |
---|---|
/ | ^ @ ! # |
替换分隔符可以是任意字符 |
& |
获取匹配的模式 |
( ) \1 \2 \3 |
使用 ( 和 ) 进行分组。在替换中使用 \1 、\2 引用分组 |
替换字符串的所有出现
$ sed 's/old/new/g' file.txt
仅替换字符串的第 n 次出现
$ sed 's/old/new/2' file.txt
仅在第 5 行替换字符串
$ sed '5 s/old/new/' file.txt
将 "world" 替换为 "universe",但仅当行以 "hello" 开头时
$ sed '/hello/s/world/universe/' file.txt
移除每行末尾的 ""
$ sed 's/\\$//' file.txt
移除每行开头的所有空白字符
$ sed 's/^\s*//' file.txt
移除注释。即使是行尾的注释
$ sed 's/#.*$//' file.txt
搜索字符串并仅打印匹配的行
$ sed -n '/hello/p' file.txt
不区分大小写搜索
$ sed -n '/hello/Ip' file.txt
搜索字符串但仅输出不匹配的行
$ sed -n '/hello/!p' file.txt
在第 2 行后追加行
$ sed '2a 第 2 行后的文本' file.txt
在文件末尾追加行
$ sed '$a 文件结束!' file.txt
从第 3 行开始,每隔 3 行追加一行
$ sed '3~3a 一些文本' file.txt
给文件行编号(简单左对齐)
$ sed = file.txt | sed 'N;s/\n/\t/'
给文件行编号(数字在左侧,右对齐)
$ sed = file.txt | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
给文件行编号,但仅当行不为空时打印数字
$ sed '/./=' file.txt | sed '/./N; s/\n/ /'
计算行数(模拟 "wc -l")
$ sed -n '$='
在第 5 行前插入文本
$ sed '5i 第五行' file.txt
在包含 "hello" 的每一行前插入 "示例: "
$ sed '/hello/i 示例: ' file.txt
删除文件中的第 5-7 行
$ sed '5,7d' file.txt
从第 3 行开始,每隔 2 行删除一行
$ sed '3~2d' file.txt
删除文件中的最后一行
$ sed '$d' file.txt
删除以 "Hello" 开头的行
$ sed '/^Hello/d' file.txt
删除所有空行
$ sed '/^$/d' file.txt
删除以 "#" 开头的行
$ sed '/^#/d' file.txt
双倍行距
$ sed G
删除所有空行并双倍行距
$ sed '/^$/d;G'
三倍行距文件
$ sed 'G;G'
取消双倍行距
$ sed 'n;d'
在匹配 "regex" 的行上方插入一个空行
$ sed '/regex/{x;p;x;}'
在匹配 "regex" 的行下方插入一个空行
$ sed '/regex/G'
在匹配 "regex" 的行上下各插入一个空行
$ sed '/regex/{x;p;x;G;}'