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

相关推荐

  • Linux软件管理(rpm,yum)

    Linux的应用程序安装提供了两中格式的软件包:一种是软件开发者直接提供的源码包;另一种是发行版厂商提供事先编译好打包的软件包;用户需要根据需要来选择何种方式安装软件,作为系统管理运维人员,要想合理应用,必须熟悉这两者之间的内在联系以及各自的特性和差异; *软件包管理工具)   — RPM软件包管理工具  — YUM软件包前端管理工具 软…

    Linux干货 2016-08-29
  • N23_第五周

    1.显示/boot/grub/grub.conf中以至少一个空白字符开头的行 egrep “^[[:space:]]{1,}” /boot/grub/grub.conf 2.显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行 egrep “^#[[:space:]]{1,}.*[^[:space…

    Linux干货 2017-02-27
  • 深入理解java嵌套类和内部类

    一、什么是嵌套类及内部类   可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:  其一、在一个类(外部类)中直接定义的内部类;  其二、在一个方法…

    Linux干货 2015-04-07
  • 马哥linux运维第一天感受

    101个人的大家庭

    Linux干货 2018-03-26
  • 图文演示Netmeeting的三大功能

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://jeffyyko.blog.51cto.com/28563/153578     可能很多朋友对Netmeeting有一定认识,但我想真正用过的朋友应该不多,因为类似的软件太多太多了,所以Netmeet…

    Linux干货 2015-03-25
  • grep、egrep、fgrep命令和正则表达式用法

    一、简介  1.1、grep说明    grep命令简单来说就是linux系统实现文本内容筛选过滤的命令。当我们需要快速定位查找文本(通常是配置文件)中我们需要的内容时,使用grep命令绝对算是最有效的处理方式之一。原因就在于grep可以配合包括“管道”、“正则表达式”等命令完成我们想要的关键字筛选过滤功能。个人认为不管是喜欢L…

    Linux干货 2015-08-31