目录

Shell三大利器之sed

sed (stream editor)流编辑器也是linux中的一条命令,在shell中经常需要用到的非交互式修改文件内容的命令。sed处理文本是按行处理,也就是读一行处理一行。

sed的常用参数

  • -n 屏蔽默认输出;如果不加-n选项会全部输出文本满足条件的行再重复输出
  • -r 如果使用扩展正则,则需要添加-r选项,默认不支持扩展正则,只支持标准正则
  • -i 直接修改源文件;不加-i只会在屏幕临时输出不会修改源文件,一般测试过命令无误才会在脚本中使用-i选项

sed常用命令

  1. a 在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
  2. b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
  3. c 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
  4. i 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
  5. d 从模板块(Pattern space)位置删除行
  6. D 删除模板第一行
  7. i 在当前行上面插入文本。
  8. h 把模板空间里的内容复制到暂存缓冲区
  9. H 把模板空间里的内容追加到暂存缓冲区
  10. g 把暂存缓冲区里的内容复制到模板空间,覆盖原有的内容
  11. G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
  12. l 列出非打印字符
  13. n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
  14. N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
  15. q 结束或退出sed
  16. r 从文件中读取输入行
  17. ! 对所选行以外的所有行应用命令
  18. s 用一个字符串替换另一个 s/re/string,用string替换正则表达式re
  19. g 在行内进行全局替换
  20. w 写并追加模板块到file末尾。将所选的行写入文件
  21. W 写并追加模板块的第一行到file末尾。
  22. x 交换暂存缓冲区与模板空间的内容
  23. y 将字符替换为另一字符(不能对正则表达式使用y命令)
  24. p 打印行,常与-n一起用
  25. = 打印当前行号码。
  26. # 把注释扩展到下一个换行符以前
  27. t if分支,从最后一行开始,条件一旦满足或者Tt命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
  28. T 错误分支,从最后一行开始,一旦发生错误或者Tt命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

操作的文本

  1. vim rumenz.txt
  2. 123
  3. 456
  4. 789
  5. 000
  6. 入门
  7. 小站
  8. 入门小站
  9. 001
  10. 002
  11. 003
  12. 004
  13. 005

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开头的行去掉#

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的内容
原文链接:https://rumenz.com/shell/shell-sed.html
↑回到顶部↑
入门小站 @2018