当前位置:   article > 正文

Linux三剑客之sed命令详解_sed查找文件内容

sed查找文件内容

1、概述

Linux三剑客:grep、sed、awk。grep主打查找功能,sed主要是编辑行,awk主要是分割列处理。本篇文章我们详细介绍sed命令。

sed 是stream editor的简称,也就是流编辑器。它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

2、语法+实例

  1. [root@liuchao ~]# sed --help
  2. 用法: sed [选项] '命令' [输入文件]

2.1、常用命令 

  • y:替换字符,通常y命令的用法是这样的:y/Source-chars/Dest-chars/,分割字符/可以用任意单字符代替,用Dest-chars中对应位置的字符替换掉Soutce-chars中对应位置的字符,Dest-chars字符长度必须和Soutce-chars长度一致
  1. # 要查找的文件内容
  2. [root@liuchao sed_test]# cat sedtest_01.txt
  3. this is a page1
  4. this is a page2
  5. this is a page3
  6. this is a page4
  7. # 将文件内的所有‘p’字符替换为'd' 字符 将替换结果打印到屏幕上
  8. [root@liuchao sed_test]# sed 'y/p/d/' sedtest_01.txt
  9. this is a dage1
  10. this is a dage2
  11. this is a dage3
  12. this is a dage4
  13. # 源文件其实是未替换的
  14. [root@liuchao sed_test]# cat sedtest_01.txt
  15. this is a page1
  16. this is a page2
  17. this is a page3
  18. this is a page4
  19. [root@liuchao sed_test]#
  20. # 目标字符长度和源字符长度不一致 报错
  21. [root@liuchao sed_test]# sed 'y/page/dd/' sedtest_01.txt
  22. sed:-e 表达式 #1,字符 10:“y”命令的字符串长度不同
  • s:替换字符串,通常s命令的用法是这样的:1,$s/Regexp/Replacement/Flags,分隔字符/可以用其他任意单字符代替,用Replacement替换掉匹配字符串
  1. # 查找文件内容
  2. [root@liuchao sed_test]# cat sedtest_01.txt
  3. this is a page1
  4. this is a page2
  5. this is a page3
  6. this is a page4
  7. # s和y 功能相识,唯一有区别的是目标字符长度和源字符长度可以不一致
  8. [root@liuchao sed_test]# sed 's/pa/ddd/' sedtest_01.txt
  9. this is a dddge1
  10. this is a dddge2
  11. this is a dddge3
  12. this is a dddge4
  13. [root@liuchao sed_test]#
  • a\:追加行,a\的后面跟上字符串s(多行字符串可以用\n分隔),则会在当前选择的行的后面都加上字符串s
  • c\:替换行,c\后面跟上字符串s(多行字符串可以用\n分隔),则会将当前选中的行替换成字符串s
  • i\:插入行,i\后面跟上字符串s(多行字符串可以用\n分隔),则会在当前选中的行的前面都插入字符串s
  • d:删除行delete,该命令会将当前选中的行删除
  1. # 测试文件内容
  2. [root@liuchao sed_test]# cat sedtest_01.txt
  3. this is a page1 Page5 page6
  4. test is a page10
  5. this is a page2
  6. this is a page3
  7. this is a page4
  8. this is a Page7
  9. test is a page9
  10. # 删除所有空白行
  11. [root@liuchao sed_test]# sed '/^$/d' sedtest_01.txt
  12. this is a page1 Page5 page6
  13. test is a page10
  14. this is a page2
  15. this is a page3
  16. this is a page4
  17. this is a Page7
  18. test is a page9
  19. # 删除第二行
  20. [root@liuchao sed_test]# sed '2d' sedtest_01.txt
  21. this is a page1 Page5 page6
  22. this is a page2
  23. this is a page3
  24. this is a page4
  25. this is a Page7
  26. test is a page9
  27. # 删除第二行至最后一行
  28. [root@liuchao sed_test]# sed '2,$d' sedtest_01.txt
  29. this is a page1 Page5 page6
  30. # 删除最后一行
  31. [root@liuchao sed_test]# sed '$d' sedtest_01.txt
  32. this is a page1 Page5 page6
  33. test is a page10
  34. this is a page2
  35. this is a page3
  36. this is a page4
  37. this is a Page7
  38. test is a page9
  39. # 删除所有以 ‘test’ 开头的行
  40. [root@liuchao sed_test]# sed '/^test/'d sedtest_01.txt
  41. this is a page1 Page5 page6
  42. this is a page2
  43. this is a page3
  44. this is a page4
  45. this is a Page7
  46. [root@liuchao sed_test]#
  • p:打印print,该命令会打印当前选择的行到屏幕上
  1. # 测试文件内容
  2. [root@liuchao sed_test]# cat sedtest_2.txt
  3. this is a page1 Page5 page6
  4. this is a page2
  5. this is a page3
  6. this is a page4
  7. this is a Page7
  8. [root@liuchao sed_test]#
  9. # 打印所有行 可以看出所有行打印了两边
  10. [root@liuchao sed_test]# sed p sedtest_2.txt
  11. this is a page1 Page5 page6
  12. this is a page1 Page5 page6
  13. this is a page2
  14. this is a page2
  15. this is a page3
  16. this is a page3
  17. this is a page4
  18. this is a page4
  19. this is a Page7
  20. this is a Page7
  21. # 将匹配出的结果打印一遍
  22. [root@liuchao sed_test]# sed '/page2/p' sedtest_2.txt
  23. this is a page1 Page5 page6
  24. this is a page2
  25. this is a page2
  26. this is a page3
  27. this is a page4
  28. this is a Page7
  29. [root@liuchao sed_test]#
  • =:打印当前行号码。
  1. [root@liuchao sed_test]# cat sedtest_01.txt
  2. this is a page1
  3. this is a page2
  4. this is a page3
  5. this is a page4
  6. [root@liuchao sed_test]# sed = sedtest_01.txt
  7. 1
  8. this is a page1
  9. 2
  10. this is a page2
  11. 3
  12. this is a page3
  13. 4
  14. this is a page4
  15. [root@liuchao sed_test]#

2.2、常用选项

  • -n 使用安静silent模式。在一般sed的用法中,所有来自stdin的内容一般都会被列出到屏幕上。但如果加上-n参数后,则只有经过sed特殊处理的那一行(或者动作)才会被列出来
  • -e 直接在指令列模式上进行 sed 的动作编辑
  • -f 直接将 sed 的动作写在一个文件内,-f filename则可以执行filename内的sed命令
  • -r 让sed命令支持扩展的正则表达式(默认是基础正则表达式)
  • -i 直接修改读取的文件内容,而不是由屏幕输出
  1. # 测试文件内容
  2. [root@liuchao sed_test]# cat sedtest_01.txt
  3. this is a page1 page5 page6
  4. this is a page2
  5. this is a page3
  6. this is a page4
  7. # 通过 s g 查找所有匹配的字符串 并打印再屏幕上 注意:源文件内容未被更改
  8. [root@liuchao sed_test]# sed 's/pa/dd/g' sedtest_01.txt
  9. this is a ddge1 ddge5 ddge6
  10. this is a ddge2
  11. this is a ddge3
  12. this is a ddge4
  13. # 再次查看源文件内容,源文件未被更改
  14. [root@liuchao sed_test]# cat sedtest_01.txt
  15. this is a page1 page5 page6
  16. this is a page2
  17. this is a page3
  18. this is a page4
  19. # 通过 s g 查找所有匹配的字符串 并更改源文件内容
  20. [root@liuchao sed_test]# sed -i 's/pa/dd/g' sedtest_01.txt
  21. [root@liuchao sed_test]#
  22. # 可以看出源文件内容被更改
  23. [root@liuchao sed_test]# cat sedtest_01.txt
  24. this is a ddge1 ddge5 ddge6
  25. this is a ddge2
  26. this is a ddge3
  27. this is a ddge4
  28. [root@liuchao sed_test]#

2.3、替换选项

  • \digit:Replacement中可含有后向引用中的\digit(digit是1至9),引用前面定义的子表达
  • &:代表模版空间中的整个匹配部分
  • \L:将在其后的替换部分转换成小写字母,直到发现一个\U或\E,GNU扩展功能
  • \l:将下一个字符转换成小写字母,GNU扩展功能
  • \U:将在其后的替换部分转换成大写字母,直到发现一个\L或\E,GNU扩展功能
  • \u:将下一个字符转换成大写字母,GNU扩展功能
  • \E:停止由\L或\U指示开始的大小写转换,GNU扩展功能

2.4、标志选项

  • g:将用Replacement替换模版空间中所有匹配Regexp的部分,则不仅仅是第一个匹配部分

加上g标识,将会替换行所有匹配的字符串

  1. # 查找的文件内容
  2. [root@liuchao sed_test]# cat sedtest_01.txt
  3. this is a page1 page5 page6
  4. this is a page2
  5. this is a page3
  6. this is a page4
  7. [root@liuchao sed_test]#
  8. # 通过s 查找每行第一个匹配的
  9. [root@liuchao sed_test]# sed 's/pa/dd/' sedtest_01.txt
  10. this is a ddge1 page5 page6
  11. this is a ddge2
  12. this is a ddge3
  13. this is a ddge4
  14. # 通过 s g 组合查找每行所有匹配
  15. [root@liuchao sed_test]# sed 's/pa/dd/g' sedtest_01.txt
  16. this is a ddge1 ddge5 ddge6
  17. this is a ddge2
  18. this is a ddge3
  19. this is a ddge4
  20. [root@liuchao sed_test]#
  • digit:只用Replacement替换模版空间中第digit(digit是1至9)个匹配Regexp的部分
  • p:若发生了替换操作,指示显示模版空间中新的数据
  • w file-name:若发生了替换操作,指示将模版空间中新的数据写入指定的文件file-name中
  • i:表示进行Regexp匹配时,是不区分大小写字母的
  1. # 查找文件内容
  2. [root@liuchao sed_test]# cat sedtest_01.txt
  3. this is a page1 Page5 page6
  4. this is a page2
  5. this is a page3
  6. this is a page4
  7. this is a Page7
  8. [root@liuchao sed_test]#
  9. # 通过 s i 查找每行第一个匹配的字符串 并替换打印在屏幕
  10. [root@liuchao sed_test]# sed 's/pa/dd/i' sedtest_01.txt
  11. this is a ddge1 Page5 page6
  12. this is a ddge2
  13. this is a ddge3
  14. this is a ddge4
  15. this is a ddge7
  16. [root@liuchao sed_test]#
  17. # 通过 s ig 标志位组合方式查找每行所有匹配的字符串,并替换打印在屏幕
  18. [root@liuchao sed_test]# sed 's/pa/dd/ig' sedtest_01.txt
  19. this is a ddge1 ddge5 ddge6
  20. this is a ddge2
  21. this is a ddge3
  22. this is a ddge4
  23. this is a ddge7
  24. [root@liuchao sed_test]#

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/628012
推荐阅读
相关标签
  

闽ICP备14008679号