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
下一篇 2018-03-15

相关推荐

  • ☞awk

    awk

    Linux干货 2016-09-24
  • Linux的发展史

    Linux的诞生 1987年荷兰阿姆斯特丹Vrije大学的Andrew S.Tanenbaum 教授为了让学生们更了解操作系统而参照Unix系统编写了Minix系统。在1988年芬兰赫尔辛基大学迎来了一位新生Linus Benedict Torvalds ,他在学习了Minix系统后,以此为平台和指导开发出了Linux。在1991年8月Linus Toval…

    Linux干货 2016-10-19
  • Linux自动备份脚本

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://nolinux.blog.51cto.com/4824967/1541163        今天网上一个朋友问了我一个shell的题目,让我帮他做下。下面是题目以及解题思路。 题目:…

    Linux干货 2016-08-15
  • 进程管理

    1、ps命令 查看当前时刻的进程状态,通过此命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等 进程状态:     运行态:running     就绪态:ready     睡眠态: &…

    Linux干货 2016-09-10
  • 逻辑卷管理

    逻辑卷管理 一 创建逻辑卷 1 准备分区或硬盘 这里使用/dev/sdb、/dev/sdc两块硬盘和/dev/sda9、/dev/sda10两个分区,大小都为1G,磁盘有限,我也不想这么抠的。 添加分区/dev/sda9、 /dev/sda10 [root@centos7 ~]# fdisk /dev/sda Welcome to fdisk (u…

    Linux干货 2017-05-02
  • Linux的用户组和权限(二)

      一、1.passwd 设置密码(类似usermod的用法)       passwd[OPTIONS] UserName:          修改指定用户的密码,仅root用户有权限       …

    Linux干货 2016-08-08