当前位置:   article > 正文

Shell学习15天(流编辑器sed概览)- 09day_实现一个简易行编辑器,根据编辑指令输出最后结果。编辑指令包括以下几种

实现一个简易行编辑器,根据编辑指令输出最后结果。编辑指令包括以下几种

(一) sed流编辑器

sed 是一种在线的非交互式的编辑器,它一次处理一行内容。
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed和grep不一样,不管是否找到指定的模式,它的状态都是0

只有当命令存在语法错误时,sed的退出状态才是非0。

(二)sed 对正则表达式的支持

(三)sed命令的格式

  • sed 选项 '动作' 文件名
  • sed [options] -f scriptfile file(s)        ##scriptfile 为存储命令(动作的文件)
  • cat 文件名 | sed 选项 '动作'

选项:
-n :只显示被修改的行的内容
-e :直接在命令列模式上进行 sed 的动作编辑;
-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
-r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
-i :直接修改读取的文件内容,而不是输出到终端。

动作:
a :在指定行后 新增一行或多行内容
c :替换指定行的内容
d :删除指定行的内容
i :在指定行之前 插入一行或多行内容
s :替换指定内容

p :   打印模式空间的行

(四) sed编辑器的几种用法

4.1 对模式空间的文件内容进行 增 删 改(替换行) 查

删除行内容

1、删除行内容删除第2行的内容

  • cat file.txt | sed '2d'        或         sed '2d' file.txt

2、删除第2-5行的内容

  • cat file.txt | sed '2,5d'      或       sed '2,5d' file.txt

3、删除第2行到最后一行的内容

  • cat file.txt | sed '2,$d'      或       sed '2,$d' file.txt

 

新增、插入 行内容

1、在第2行后新增内容

  • cat file.txt | sed '2a hello world'

2、在第2行前插入内容

  • cat file.txt | sed '2i hello world

3、在第2行后新增2行内容

  • cat file.txt | sed '2a hello\nworld'

 

替换行内容

1、把第2行的内容替换为 hello world

  • cat file.txt | sed '2c hello world'

2、把第2-5行的内容替换为 hello world

  • cat file.txt | sed '2,5c hello world'

3、只显示被修改的行的内容

  • cat file.txt | sed -n '2c hello world'

 

搜索指定内容  '//'

1、搜索含有abc的行

  • cat file.txt | sed -n '/abc/p'       

2、搜索并删除指定内容

  • cat file.txt | sed '/abc/d'

4.2  替换指定内容  

替换指定内容  's///'  可 's###'  或 's@@@'

1、默认只替换每行中模式首次匹配的内容

  • cat file.txt | sed 's/abc/'替换后的内容'/'

2、g标记可以使sed执行全局替换,i标记是忽略大小写的意思

  • cat file.txt | sed 's/abc/'替换后的内容'/gi'

3、g标记可以使sed替换第N次出现的匹配

  • sed 's/abc/xxx/2g' file.txt

 

基本几种用法就是上面例举的。下面以几个实际的例子来看看其他一些在sed中需要特别留意的特殊符号:

4.3  操作文件内容时候备份原文件,看下面i.bak 多了passwd.bak

  1. [hujianmei@localhost days_09]$ 操作文件内容时候备份源文件^C
  2. [hujianmei@localhost days_09]$ ll
  3. 总用量 20
  4. -rw-rw-r-- 1 hujianmei hujianmei 216 220 10:24 break1.sh
  5. -rw-rw-r-- 1 hujianmei hujianmei 385 220 22:16 passwd
  6. -rw-rw-r-- 1 hujianmei hujianmei 197 220 10:50 print_99.sh
  7. -rw-rw-r-- 1 hujianmei hujianmei 183 220 11:02 shift01.sh
  8. -rw-rw-r-- 1 hujianmei hujianmei 92 220 10:53 shift.sh
  9. [hujianmei@localhost days_09]$ sed -i.bak 's/root/Root/' passwd
  10. [hujianmei@localhost days_09]$ ll
  11. 总用量 24
  12. -rw-rw-r-- 1 hujianmei hujianmei 216 220 10:24 break1.sh
  13. -rw-rw-r-- 1 hujianmei hujianmei 385 220 22:36 passwd
  14. -rw-rw-r-- 1 hujianmei hujianmei 385 220 22:16 passwd.bak
  15. -rw-rw-r-- 1 hujianmei hujianmei 197 220 10:50 print_99.sh
  16. -rw-rw-r-- 1 hujianmei hujianmei 183 220 11:02 shift01.sh
  17. -rw-rw-r-- 1 hujianmei hujianmei 92 220 10:53 shift.sh
  18. [hujianmei@localhost days_09]$ cat passwd
  19. Root:x:0:0:root:/root:/bin/bash
  20. bin:x:1:1:bin:/bin:/sbin/nologin
  21. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  22. adm:x:3:4:adm:/var/adm:/sbin/nologin
  23. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  24. sync:x:5:0:sync:/sbin:/bin/sync
  25. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  26. halt:x:7:0:halt:/sbin:/sbin/halt
  27. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  28. operator:x:11:0:operator:/Root:/sbin/nologin
  29. [hujianmei@localhost days_09]$ cat passwd.bak
  30. root:x:0:0:root:/root:/bin/bash
  31. bin:x:1:1:bin:/bin:/sbin/nologin
  32. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  33. adm:x:3:4:adm:/var/adm:/sbin/nologin
  34. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  35. sync:x:5:0:sync:/sbin:/bin/sync
  36. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  37. halt:x:7:0:halt:/sbin:/sbin/halt
  38. mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
  39. operator:x:11:0:operator:/root:/sbin/nologin
  40. [hujianmei@localhost days_09]$

4.4  已匹配字符串标记用 & 表示,在 sed 中 & 指代模式所匹配到的字符串

  1. [hujianmei@localhost days_09]$ cat>file<<EOF
  2. > abc 123 abc123 123abc
  3. > EOF
  4. [hujianmei@localhost days_09]$ cat file
  5. abc 123 abc123 123abc
  6. [hujianmei@localhost days_09]$ &表示模式匹配到的字符串^C
  7. [hujianmei@localhost days_09]$ sed 's/abc/[&]/g'
  8. file
  9. file
  10. ^C
  11. [hujianmei@localhost days_09]$ sed 's/abc/[&]/g' file
  12. [abc] 123 [abc]123 123[abc]
  13. [hujianmei@localhost days_09]$

4.5  在sed中使用标签匹配字符串

在sed中 \1  \2 \3 指代出现在括号中的部分正则表达式所匹配到的内容,注意是部分哦,部分匹配那么这一整个字符串都会打印出来的哈~  这个还没理解到

 

4.6  sed 组合多个表达式

  1. [hujianmei@localhost days_09]$ sed组合多个表达式^C
  2. [hujianmei@localhost days_09]$ echo abc 123 |sed -r 's/[a-z]+/xxx/' | sed -r 's/[0-9]+/666/'
  3. xxx 666
  4. [hujianmei@localhost days_09]$ echo abc 123 |sed -r 's/[a-z]+/xxx/' ; 's/[0-9]+/666/'
  5. xxx 123
  6. bash: s/[0-9]+/666/: 没有那个文件或目录
  7. [hujianmei@localhost days_09]$ echo abc 123 |sed -r 's/[a-z]+/xxx/ ; s/[0-9]+/666/'
  8. xxx 666
  9. [hujianmei@localhost days_09]$

 

 

 

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

闽ICP备14008679号