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

相关推荐

  • LVM管理

    1、逻辑卷管理器(LVM) (1)逻辑卷管理器(LVM,logical volume manager)可以整合多个物理分区在一起,让这些分区看起来就像一个磁盘一样,而且,还可以在将来其他的物理分区或将其从这个LVM管理的磁盘中删除。这样可以实现磁盘空间的动态管理,相对于普通的磁盘分区有很大的灵活性,同时LVM还有快照功能。 (2)逻辑卷管理器的基本术语 物理…

    Linux干货 2016-09-01
  • 简单的bash脚本查看任意网段的在线主机

    一前言         最近看到许多同志在写ping某个地址段的bash脚本,我也心血来潮来了一发。  当然本人新手,大神勿喷。 二准备工作           linux系统的机…

    2017-03-02
  • 文本处理之sed

     sed:是一种行编辑器,它在处理行时会把要处理的行读入模式空间中,处理的是模式空间的内容,一行一行的处理,然后把处理结果显示在屏幕中,不对原文做修改,除非强制重定向。   好处:可同时编辑一个或多个文件,简化了对文件的反复操作。 sed用法:   格式: sed [options ]…'script&#0…

    Linux干货 2016-08-15
  • alias——Linux基本命令(4)

    1.     alias别名 (1)查看、设置别名 Linux系统提供了一个有用的工具叫alias,可以让我们将一些需要频繁使用的但又过于冗长的命令设置一个别名,这样一来,以后只需输入一个简短的别名就可以达到同样的作用。 alias显看当前已定义的别名   使用aliasaliname=’comm…

    2017-07-13
  • 文本及文件查找练习

    1、显示当前系统上root、fedora或user1用户的默认shell;     ~]# cat /etc/passwd | grep "^\(root\|fedora\|user1\)\>" | cut -d: -f1,7    root:/bin/…

    Linux干货 2016-10-24
  • Linux运维学习历程-第九天-bash脚本初步了解

    概述:   本章重点在于讲解bash脚本的基础知识,为今后学习使用bash脚本打下基础 一、bash基础特性         程序:指令+数据             指令:由程序文件提供         &n…

    Linux干货 2016-08-18