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

相关推荐

  • LVS

    LVS概念 LVS(Linux Virtual Server):Linux 虚拟服务器  LVS是个负载均衡设备,它不提供任何服务,用户请求到这里的时候,它是将客户需求转发至后端真正提供服务的服务,所以说后端的服务称作real server。LVS分为两段,前一段称为ipvsadm(管理集群服务的命令行工具),后面一段叫做ipvs(内核模块) LVS的类型 …

    Linux干货 2017-02-17
  • 第一周博客作业

       本文介紹計算机的组成及其功能 、Linux各版本的联系与区别、Linux的哲学思想、Linux系统上命令的使用格式及介绍部分命令、如何在Linux系统上获取帮助信息以及Linux发行版的基础目录名称以及规定。 一、计算机的组成及其功能 1)什么是计算机? 想了解计算机的组成,首先得了解计算机的含义。计算机其实是:接收用户输入指令与数…

    Linux干货 2016-12-04
  • 三.Linux博客-2016年7月24日帮助、history、别名、tree

    格式说明: 操作 概念 命令 说明及举例 三-1.帮助、history、别名、tree touch /etc/nologin 使普通用户不能登录(创建了一个文件,删掉就可以登陆)   ll /etc/nologin 查看那个文件 -rm -f /etc/  删…

    Linux干货 2016-08-23
  • Apc缓存Opcode

    1、PHP执行 PHP的运行阶段也分成三个阶段: Parse。语法分析阶段。 Compile。编译产出opcode中间码。 Execute。运行,动态运行进行输出。                            …

    Linux干货 2015-04-10
  • 推荐-Linux Namespace的一点理解

        下文的原文来自: http://blog.csdn.net/preterhuman_peak/article/details/40857117    原文写的非常好,下文中大部分文字描述来自原文,我仅做了一点理解性的插图和实验部分。    &…

    Linux干货 2016-03-28
  • MySQL架构

    1.MySQL整体逻辑架构 我们先下图看看MySQL整体逻辑架构(MySQL’s Logical Architecture)                       图1  第一层,即最上一层,所包含的服务并不是MySQL所独有的技术。…

    Linux干货 2015-04-13