sed使用的注意事项

sed

1、-i选项使用的问题:
-i[suffix] (注意中间无空格)
sed -i在修改文件内容的时候,会先将原文件保存,保存的名称为[原文件名][suffix]
例如:sed -i’.bak’ -i ‘s/aaa//g’/tmp/message
(1)第一个-i代表修改文件名的选项,第二个-i代表替换内容的选项
(2)-i’.bak’代表先将原文件改名为”原文件.bak”,然后依据原文件中的内容创建一个临时文件,并在临时文件中进行修改操作,并在流处理过程结束后将该临时文件重命名为原文件名。(原文件名已经被备份,且以.bak后缀保存)

2、sed文本处理

在进行处理文本的时候,只知道在进行流处理的该行的行数,也就是说只有处理到文件的最后一行,sed才知道这行是最后一行,并且此时才会给这行打上$的标记。所以,用$-1来表示倒数第二行是错误的。(sed采用行号计数器来只是临时记录当前的行号)

3、sed -n ‘3,5!p’ filename
1、引号中的内容为,不打印3到5行的内容。(这一句其实包含了三层内容:1、3~5行不打印;2、其余的行都会打印;3、sed的默认autooutput还会再次将全文内容打印一次)
2、也就是说,如果不使用-n选项的话,该语句会将全文内容输出两遍,第一遍为p命令的输出(不包含3~5行),第二遍为autooutput的输出

示例:vim /tmp/message
#1 aaa
#2 bb
#3 ccd
#4 eee
#5 eeeeeeee

(1)如果使用sed -n ‘3,5!p’ /tmp/message的话会输出如下内容:只显示第1,2行内容
#1 aaa //p命令输出的内容
#2 bb //p命令输出的内容
(2)如果使用sed ‘3,5!p’ /tmp/message的话会输出如下内容:
#1 aaa //p命令输出的内容
#2 aaa //autooutput的输出内容
#3 bb //p命令输出的内容
#4 bb //autooutput的输出内容
#5 ccd //autooutput的输出内容
#6 eee //autooutput的输出内容
#7 eeeeeee //autooutput的输出内容

3、地址定界问题:

在进行地址定界匹配时,有时候会出现语法错误,可能就会导致不可预料的错误
(1)sed -n ‘/3,5/!p’ /tmp/message :如果按照上面的‘禁止输出3到5行的内容’要求,并且使用这条语句的话,就会输出如下内容:
#1 aaa
#2 bb
#3 ccd
#4 eee
#5 eeeeeeee
原因:引号中的内容表示的是在/tmp/message中找出“3,5”这个字符串所在的行,并且不输出。而不是3-5行。
(2) 如果使用sed -n ‘3,8!p’ /tmp/message的话,就会输出如下内容:
#1 aaa
#2 bb
原因:引号中的内容为不输出3-8行的内容,但实际结果为文本只有5行,因此,只会显示前面两行,这个比较好理解。
(3) 使用sed -n ‘6,7!p’ /tmp/message的话,就会输出以下内容:(输出全文)
#1 aaa
#2 bb
#3 ccd
#4 eee
#5 eeeeeeee
原因:引号中的为不输出6-7行的内容,实际情况是文本根本没有6-7行,因此这个地址定界其实是无效的,相当于是说这个地址定界内容为空,sed会输出全文的内容,因此就会输出以上内容。

总结:
假设地址定界表达式为’a1,a2’,则sed会根据以下规则查找地址范围:
(1)从文本的第一行开始,寻找第一个匹配a1的行:
能匹配到a1:假设第一个匹配a1的行为n1,则开始从n1+1行开始寻找匹配a2的行
能匹配到a2:假设第一次匹配到a2的行为n2,则文本就会以n1~n2为地址范围,并且开始从n2+1开始再次搜索匹配a1的行,查找规则相同。
不能匹配到a2:不能匹配到a2的话,地址范围就成为了n1~$,也就是说从n1到结尾,并且sed跳出循环查找。
不能匹配到a1:不能匹配a1的话,sed直接跳出循环查找,地址范围为空。
(2)注意一些[!COMMAND]匹配地址范围的用法。还是拿只有5行的/tmp/message来举例。
a、’4,6!p’:4-6行不打印,也就是说1-3行打印
b、’6,7p’:只有6-7行打印,也就是说1-5行(全文)都不打印
(3)除了p命令外,其他很多命令都可以结合地址空间来进行丰富的操作。
(4)字符串匹配与行数匹配语法不同,字符串匹配使用’/a1/,/a2/’来表示,其地址范围查找是与行数查找相同的。

4、删除命令d的特性及使用:delete pattern space. start next cycle
特性:删除模式空间的所有内容,并立即跳出script循环,进入下一个sed循环,即读取下一行。
示例:
删除/tmp/message中的第3行,并保存至文件:sed -i ‘3d’ /tmp/message
删除/tmp/message中以‘#’号开头的注释行,但不删除第一行的#!/bin/bash不能删除:sed ‘/^#/{1!d}’ /tmp/message
sed -n ‘3d;3p’ message 是没有输出的,而sed -n ‘3d;2p’ message是有输出的,因为删除操作执行后,所有的对于这些已删除的内容是无效的,只会从已删除内容的下一行执行操作。

5、替换命令之y命令:将字符进行一一替换
示例:将message中包含有aaa,aaA,aAa,Aaa,AAa,aAA,AAA的字符串全部替换为aaa:也就是说只要包含了三个a的字符串,无论是什么情况都转换为小写的aaa字符串。
sed ‘y/AAA/aaa/’ message

6、替换命令之s命令:将匹配到的内容替换成指定内容
示例:
(1)删除message中所有”#”开头(可以包括前导空白)的注释符号”#”,但第一行”#!/bin/bash”不处理。
sed -i ‘2,$s/^[\t]*#//’ /tmp/message,
也可以使用 sed ‘2,$s/^[[:space:]]\{0,\}#//’ /tmp/message

(2)在某行行首添加注释#,sed -i ’90,s/^/#/’ filename

sed的buffer空间数据交换命令:h,H,g,G,x
特性:buffer也叫保持空间,初始状态和模式空间一样都是空的;无论是交换追加还是覆盖,原空间的内容都不会改变。

保持空间的作用很大,它和模式空间之间的数据交换能实现很多看上去不能实现的功能,是实现sed高级功能所必须的,例如”窗口滑动”。同样,这不是本文的内容。所以只简单解释这几个命令的作用:

“h”命令:将当前模式空间中的内容覆盖到保持空间。
“H”命令:在保持空间的尾部加上一个换行符”\n”,并将当前模式空间的内容追加到保持空间的尾部。
“g”命令:将保持空间的内容覆盖到当前模式空间。
“G”命令:在模式空间的尾部加上一个换行符”\n”,并将当前保持空间的内容追加到模式空间的尾部。
“x”命令:交换模式空间和保持空间的内容。

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/92445

(0)
~~
上一篇 2018-03-14 14:46
下一篇 2018-03-15 10:09

相关推荐

  • 计划任务&脚本进阶练习

    1、每天的2点和12点整,将/etc备份至/testdir/backup目录中,保存的文件名称格式为“etcbak-yyyy-mm-dd-HH.tar.xz” mkdir /testdir/backup vim /root/bin/etcbak.sh tar cvf /testdir/backup/etcbak-`date “+%F-%H”`.tar.xz …

    Linux干货 2017-03-26
  • linux中特殊符号用法

    1 #    #  管理员账户    $  普通账户   在脚本中 #也常出现在一行的开头,或者位于完整指令之后,这类情况表示符号后边是注解文字,不会被执行 例如     #!/bin/bash     #th…

    Linux干货 2016-08-15
  • 端口转发实例

    什么是端口转发?      端口转发(Port forwarding),有时被叫做隧道,是安全壳(SSH) 为网络安全通信使用的一种方法。端口转发是转发一个网络端口从一个网络节点到另一个网络节点的行为,其使一个外部用户从外部经过一个被激活的NAT路由器到达一个在私有内部IP地址(局域网内部)上的一个端口。 为什么需要端口转发? …

    2017-04-13
  • vim的总结、练习和周期性任务

    vim:VI的增强版,是一款可视化功能非常强大的文本编辑器,属于全屏编辑器。 vim:使用方法: 命令格式:    ~]#vim [options] [file ..]      选项:        +#:打开文件后,直接让光标处于第#行首;   …

    Linux干货 2017-08-14
  • Linux下的进程调度与作业管理

    Linux下的进程调度与作业管理 一、概述 1.1 进程的相关概念: 通过前面的几个章节,我们几乎已经学习了很多的linux的基础,这个章节我们讲一下linux下的进程管理,就像windows 下的进程一样,我们知道windows 下有一个任务管理器,专门用来管理进程,我们首先看一下windows 的任务管理器: 从这2个图我们可以看出,windows 下的…

    Linux干货 2016-10-17
  • N22-第七周作业

    1、创建一个10G分区,并格式为ext4文件系统;    (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;    (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; [root@localhost ~]# fd…

    Linux干货 2016-10-07