sed (stream editor) 流编辑器也是 linux 中的一条命令, 在 shell 中经常需要用到的非交互式修改文件内容的命令. sed 处理文本是按行处理, 也就是读一行处理一行.
sed 的命令基本格式是:
sed 选项 '编辑指令' 文件路径
也可以通过管道 (|) 传输参数给 sed 处理 前置命令 | sed 选项 '编辑指令'
sed 的常用参数有:
-n 屏蔽默认输出; 如果不加 - n 选项会全部输出文本满足条件的行再重复输出
-r 如果使用扩展正则, 则需要添加 - r 选项, 默认不支持扩展正则, 只支持标准正则
-i 直接修改源文件; 不加 - i 只会在屏幕临时输出不会修改源文件, 一般测试过命令无误才会在脚本中使用 - i 选项
sed 的编辑指令:
p 输出
命令 | 完整示例 | 说明 |
---|---|---|
p | sed -n 'p' 1.txt | 输出 1.txt 的所有行 |
2p | sed -n '2p' 1.txt | 输出 1.txt 的第二行 |
2,5p | sed -n '2,5p' 1.txt | 输出 1.txt 的第二行到第五行 |
2,+5p | sed -n '2,+5p' 1.txt | 输出 1.txt 的第二行和第二行以后的 5 行 |
1~2p | sed -n '1~2p' 1.txt | 输出第一行, 每隔两行输出一行, 也就是输出奇数行 |
2~2p | sed -n '1~2p' 1.txt | 输出第二行, 每隔两行输出一行, 也就是输出偶数数行 |
/ 正则 / p | sed -n '/^[0-9]/p' 1.txt | 输出 1.txt 以数字开头的行 |
$= | sed -n '$=' 1.txt | 输出 1.txt 的行数 |
d 删除
命令 | 完整示例 | 说明 |
---|---|---|
2d | sed '2d' 1.txt | 删除 1.txt 的第二行 |
2,5d | sed '2,5d' 1.txt | 删除 1.txt 的第二行到第五行 |
2,+5d | sed '2,+5d' 1.txt | 删除 1.txt 的第二行和第二行以后的 5 行 |
$d | sed '$d' 1.txt | 删除 1.txt 的最后一行行 |
/ 正则 / | sed '/^[0-9]/d' 1.txt | 删除以数字开始的行 |
! | sed '/^[0-9]/!d' 1.txt | 删除不是以数字开头的行 |
^$ | sed '^$' 1.txt | 删除 1.txt 的空行 |
s 替换
命令 | 完整示例 | 说明 |
---|---|---|
s/old/new/ | sed 's/old/new/' 1.txt | 删除 1.txt 中每行的第一个 old 都替换成 new |
s/old/new/2 | sed 's/old/new/' 1.txt | 删除 1.txt 中每行的第二个 old 都替换成 new |
s/old/new/g | sed 's/old/new/g' 1.txt | 删除 1.txt 中每行的每一个 old 都替换成 new |
s/old// | sed 's/old//' 1.txt | 删除 1.txt 中每行的第一个 old 都替换成空也就是把 old 删除 |
s/old/&s/ | sed 's/old/&s/' 1.txt | 删除 1.txt 中每行的第一个 old 都替换成 olds & 代表前面查找的字符串 |
4,7s/^/#/ | sed '4,7s/^/#/' 1.txt | 删除 1.txt 中 4-7 行开头加上# 也就是批量添加注释 |
4,7s/^#an/an/ | sed '4,7s/^#an/an/' 1.txt | 删除 1.txt 中 4-7 行以 #an 开头的行去掉 # |
替换中 s/// 可以用其他三个相同的符号代替如 s### s&&& s999 都可以 这样的符号在替换路径的时候经常用到
i/a/c 插入
命令 | 完整示例 | 说明 |
---|---|---|
行号 i | sed '2i123' 1.txt | 在 1.txt 的第二行前面插入 123 |
正则 i | sed '/^[0-9]/i123' 1.txt | 在 1.txt 中所有数字开头的行前面插入 123 |
a | 在行后插入 | 命令格式和 i 相同 |
c | 替换该行 | 命令格式和 i 相同 |
sed 高级应用
命令 | 完整示例 | 说明 |
---|---|---|
行号 r | sed -i '2r 2.txt' 1.txt | 在 1.txt 中第二行后面插入 2.txt 的内容 |
行号, 行号 r | sed -i '2,5r 2.txt' 1.txt | 在 1.txt 中第二行到第五行每行后面插入一遍 2.txt 的内容 |
/ 正则 / r | sed -i '/^[0-9]/r 2.txt' 1.txt | 在 1.txt 中以数字开头的行后每行面插入一遍 2.txt 的内容 |
w | sed '2w 3.txt' 1.txt | 在 1.txt 中第二行导出为 3.txt 的内容 |
w | sed '2,5w 3.txt' 1.txt | 在 1.txt 中第二行到第五行导出 3.txt 的内容 |
/ 正则 / r | sed -i '/^[0-9]/w 2.txt' 1.txt | 在 1.txt 中以数字开头的行导出为 3.txt 的内容 |
来源: http://www.bubuko.com/infodetail-2479793.html