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

[hujianmei@localhost days_09]$ 操作文件内容时候备份源文件^C
[hujianmei@localhost days_09]$ ll
总用量 20
-rw-rw-r-- 1 hujianmei hujianmei 216 2月  20 10:24 break1.sh
-rw-rw-r-- 1 hujianmei hujianmei 385 2月  20 22:16 passwd
-rw-rw-r-- 1 hujianmei hujianmei 197 2月  20 10:50 print_99.sh
-rw-rw-r-- 1 hujianmei hujianmei 183 2月  20 11:02 shift01.sh
-rw-rw-r-- 1 hujianmei hujianmei  92 2月  20 10:53 shift.sh
[hujianmei@localhost days_09]$ sed -i.bak 's/root/Root/' passwd
[hujianmei@localhost days_09]$ ll
总用量 24
-rw-rw-r-- 1 hujianmei hujianmei 216 2月  20 10:24 break1.sh
-rw-rw-r-- 1 hujianmei hujianmei 385 2月  20 22:36 passwd
-rw-rw-r-- 1 hujianmei hujianmei 385 2月  20 22:16 passwd.bak
-rw-rw-r-- 1 hujianmei hujianmei 197 2月  20 10:50 print_99.sh
-rw-rw-r-- 1 hujianmei hujianmei 183 2月  20 11:02 shift01.sh
-rw-rw-r-- 1 hujianmei hujianmei  92 2月  20 10:53 shift.sh
[hujianmei@localhost days_09]$ cat passwd
Root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/Root:/sbin/nologin
[hujianmei@localhost days_09]$ cat passwd.bak 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[hujianmei@localhost days_09]$ 

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

[hujianmei@localhost days_09]$ cat>file<<EOF
> abc 123 abc123 123abc
> EOF
[hujianmei@localhost days_09]$ cat file 
abc 123 abc123 123abc
[hujianmei@localhost days_09]$ &表示模式匹配到的字符串^C
[hujianmei@localhost days_09]$ sed 's/abc/[&]/g'
file
file


^C
[hujianmei@localhost days_09]$ sed 's/abc/[&]/g' file
[abc] 123 [abc]123 123[abc]
[hujianmei@localhost days_09]$ 

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

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

 

4.6  sed 组合多个表达式

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

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值