sed的基本用法已能满足大多数需求,但当需要时,知道这些高级特效的存在及如何使用将提供莫大的帮助!
 
1. 多行命令
        sed编辑器提供三个用于处理多行文本的特殊命令:
  • N:将数据流的下一行加入当前模式空间   
  • D:删除多行组中的一行
  • P:打印多行组中的一行
 
    【next命令】
         
        单行next命令:
            小写的n命令,将下一行文本移入模式空间(工作空间)并挤走已有文本,即跳过当前行进入下一行。
 # cat data1.txt
this is the header line this is the data line this is the last line

经n命令处理后可跳过第一行:

 # sed '/header/{n;d}' data1.txt
this is the header line
this is the data line this is the last line
           多行next命令:
                大写的N命令,将下一行文本并入当前模式空间,即加到已有文本之后。两个文本行合并成一行,仍以换行符分隔。
 # cat data2.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
                经N命令处理后:
 # sed '/first/{N;s/\n/ /}' data2.txt
This is the header line.
This is the first data line. This is the second data line.
This is the last line.

Tips:使用N命令可查找分散在两行的文本。注意最后一行进入模式空间,执行N命令由于没有后续的可读入行,会导致后面的命令无法执行。

 
        【多行删除命令】
                单行删除命令d和N命令一起使用时,会将模式空间的文本全部删除;
                多行删除命令D,只删除模式空间的第一行,即删除到换行符为止的所有字符(包含换行符)。
 # cat data5.txt

 This is the header line.
This is a data line. This is the last line.
 # sed '/^$/{N ; /header/D}' data5.txt
This is the header line.
This is a data line. This is the last line.

    Tips:这种办法可实现删除特殊行,比如需要同时满足两种条件的行。

 
            【多行打印命令】
                    单行打印命令会打印出模式空间内的所有文本;
                    多行打印命令仅打印多行模式空间的第一行,即打印换行符之前的所有字符。
 # sed -n '/header/{N;P}' data5.txt
This is the header line.
 
 
2. 保持空间
    sed编辑器除了模式空间(patten space)外,还有一个保持空间(hold space)。处理模式空间的某些行时,可以使用保持空间临时保存一些行。
 
命令
描述
h
H
g
G
x
将模式空间复制到保持空间
将模式空间附加到保持空间
将保持空间复制到模式空间
将保持空间附加到模式空间
交换模式空间和保持空间
        读懂以下命令,理解保持空间用法:
 # sed -n '/first/ {h ; p ; n ; p ; g ; p }' data2.txt
This is the first data line.
This is the second data line.
This is the first data line.
3. 排除命令
       感叹号命令(!)用于排除某个命令,即让原本的命令不起作用。
 # sed -n '/header/p' data2.txt
This is the header line.

普通p命令打印匹配文本行,使用!后,效果相反,不打印该行而打印其它行:

 # sed -n '/header/!p' data2.txt
This is the first data line.
This is the second data line.
This is the last line.

结合保持空间反转文本行的顺序:

 # sed -n '{1!G ; h ; $p }' data2.txt
This is the last line.
This is the second data line.
This is the first data line.
This is the header line.

Tips:sed编辑器默认会将命令循环应用在每一行文本上,因此合理使用命令,可写出简洁高效的sed脚本

 
 
4. 改变流
      sed编辑器提供了改变脚本执行流程的方法。
 
        【分支】
            分支(branch)命令(b)可只对数据流中的特定行执行命令。
 
            格式:
                    [address]b     [label]
                     address参数定义触发分支的行数,label参数用于定义要跳转的位置。若没有加label,则会跳过脚本。
            
            加address,不加label,跳过后面所有脚本:
 # sed '{2,3b ; s/This is/Is this/ ; s/line./test?/}' data2.txt
Is this the header test?
This is the first data line.
This is the second data line.
Is this the last test?

加address,加label,分支匹配处的行跳到标签处,执行标签后的命令;不匹配的行执行所有命令:

 # sed '/first/b jump1 ; s/This is the/No jump on/; :jump1 ; s/This is the/Jump here on/' data2.txt
No jump on header line.
Jump here on first data line.
No jump on second data line.
No jump on last line.

不加address,b命令无条件跳转到标签上,可造成循环的效果:

 # echo "This, is, a, test, to, remove, commas." | sed -n '{:start;s/,//1p;b start}'
This is, a, test, to, remove, commas.
This is a, test, to, remove, commas.
This is a test, to, remove, commas.
This is a test to, remove, commas.
This is a test to remove, commas.
This is a test to remove commas.
^C

该脚本不会停止循环,可使用/,/b start代替b start,在没有逗号时自动结束循环。

 
        【测试】
            测试(test)命令(t)会根据替换(s)命令的结果来跳转到某个标签。
 
            不加label,跳过后面所有命令:
 # sed 's/first/matched/; t ; s/This/Here/' data2.txt
Here is the header line.
This is the matched data line.
Here is the second data line.
Here is the last line.

加label,跳转到label处:

 # echo "This,is,a,test,to,remove,commas." | sed -n '{:start ; s/,/ /p ; t start}'
This is,a,test,to,remove,commas.
This is a,test,to,remove,commas.
This is a test,to,remove,commas.
This is a test to,remove,commas.
This is a test to remove,commas.
This is a test to remove commas.
 # sed 's/first/matched/; t ;s/This/Here/;s/line/LINE/' data2.txt
Here is the header LINE.
This is the matched data line.
Here is the second data LINE.
Here is the last LINE.
 # sed 's/first/matched/; t jump ;s/This/Here/; :jump ;s/line/LINE/' data2.txt
Here is the header LINE.
This is the matched data LINE.
Here is the second data LINE.
Here is the last LINE.

Tips:使用标签和t命令可在脚本命令中形成循环

 
5. 模式替代
 
        【&符号】
            &符号可以提取命令中匹配模式中的全部文本。
 # echo "The cat sleeps in his hat." | sed 's/.at/"&"/g'
The "cat" sleeps in his "hat".

   【替代单独的单词】

            用圆括号来定义子模式,在替换模式中用\1等引用子模式,可提取匹配模式中的部分文本。
 # echo  | sed ':start;s/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;t start'
,,

Tips:圆括号必须转义

  
6. 重定向sed输出
            
            【    $()    】
                默认情况,sed会将脚本结果输出到STDOUT,可使用$()将输出保持到变量中。和变量替换一样
 
 

【sed】进阶的更多相关文章

  1. 第11章:sed进阶操作

    第11章:sed进阶操作 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法 sed命令行格式为 ...

  2. 《Linux命令行与shell脚本编程大全》第二十一章 sed进阶

    本章介绍一些sed编辑器提供的高级特性. 21.1 多行命令 按照之前的知识,所有的sed编辑器命令都是针对单行数据执行操作的. 在sed编辑器读取数据流时,它会基于换行符的位置将数据分成行,一次处理 ...

  3. sed进阶N;P;D

    案例 sed 的高级替换 $cat file1 why:1 why:2 3 4 5 why:6 why:7 8 why:9 $cat file2 why:1 why:2 3 4 5 why:6 why ...

  4. sed进阶教程

    寻址规则 常规寻址 如果没有指定地址,那么命令将应用于每一行. 如果只有一个地址,那么命令应用于与这个地址匹配的任意行. 如果指定了由逗号分隔的两个地址,那么命令应用于匹配第一个地址(不包括第一个地址 ...

  5. sed进阶

    下面这些命令未必经常会用到,但当需要时,知道这些肯定是件好事. 一.多行命令 sed命令通常是对一行数据进行处理,然后下一行重复处理. sed编辑器包含了三个可用来处理多行文本的特殊命令 N:将数据流 ...

  6. 文本处理工具——sed进阶

    一sed的搜索替代 (一)常见的和替代相关的选项 搜索替代,和vim的写法很像 s///:查找替换,支持使用其它分隔符,s@@@,s### p: 显示替换成功的行,就是打印. w /PATH/TO/S ...

  7. Shell编程—sed进阶

    1多行命令 sed编辑器包含了三个可用来处理多行文本的特殊命令. N:将数据流中的下一行加进来创建一个多行组来处理. D:删除多行组中的一行. P:打印多行组中的一行. 1.1next命令 1. 单行 ...

  8. sed命令总结-Linux

    sed命令总结-Linux linuxsed 2018年02月08日 19时27分57秒 命令语法经常忘记,每次总是看笔记不切实际,记不起来的要多查manual,本次总结按照manual总结,希望下次 ...

  9. 两个有用的shell工具总结

    shell工具之一:sed sed基础 sed编辑器被称作流编辑器,与常见的交互式文本编辑器刚好相反.文本编辑器可以通过键盘来交互式地插入.删除.替换文本中的数据:而流编辑器是基于一组预先的规则来编辑 ...

  10. 《Linux命令行与shell脚本编程大全 第3版》

    第一部分 Linux 命令行 第1章  初识Linux she1.1   什么是Linux 21.1.1 深入探究Linux 内核 31.1.2 GNU 工具 61.1.3 Linux 桌面环境 81 ...

随机推荐

  1. 转载博客(Django2.0集成xadmin管理后台遇到的错误)

    转载博客地址:https://blog.csdn.net/yuezhuo_752/article/details/87916995 django默认是有一个admin的后台管理模块,但是丑,功能也不齐 ...

  2. 【python】写csv文件时遇到的错误

    1.错误 在许多文件中,写入csv文件时都加"wb",w指写入,b指二进制 如: csvwrite=csv.writer(open("output.csv",& ...

  3. etcd简单测试类java版

    为了方便现场安装完了etcd集群后确认集群是否好用,简单写了个测试类,网上搜的有点乱还有些不能运行,在这里再整理一个能够直接运行的 1.我把etcd的API设成3版本了,调用使用的jetcd,功能挺多 ...

  4. winfrom 自动关闭 重新MessageBox.Show("Test");

    复制代码  自动关闭 调用    AutoClosingMessageBox.Show("添加失败", "提示", 1000); #region alert p ...

  5. Django_01_创建图书管理项目

    在django中,项目的组织结构为一个项目包含多个应用,一个应用对应一个业务模块 示例:创建项目的名称为test1,完成“图书-英雄”信息的维护,创建应用名称为booktest 创建项目:首先进入到虚 ...

  6. rdb和aof二种持久化方式对比(Redis)

    我们已经知道对于一个企业级的redis架构来说,持久化是不可减少的 企业级redis集群架构:海量数据.高并发.高可用 持久化主要是做灾难恢复,数据恢复,也可以归类到高可用的一个环节里面去 比如你re ...

  7. P1912 [NOI2009]诗人小G

    P1912 [NOI2009]诗人小G 思路: 平行四边形不等式优化dp 因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式 j < i f( ...

  8. 关于IO的同步,异步,阻塞,非阻塞

    上次写了一篇文章:Unix IO 模型学习.恰巧在这次周会的时候,@fp1203 (goldendoc成员之一) 正好在讲解poll和epoll的底层实现.中途正好讨论了网络IO的同步.异步.阻塞.非 ...

  9. php 5.6 与 php 7 的区别

    1. PHP7.0 比PHP5.6性能提升了两倍. 2.PHP7.0全面一致支持64位. 3.PHP7.0之前出现的致命错误,都改成了抛出异常. 4.增加了空结合操作符(??).效果相当于三元运算符. ...

  10. Linux之ln文件创建链接

    ln命令用来为文件创建链接,链接类型分为硬链接和软链接(符号链接)两种 1)软连接和Windows系统中的快捷方式有点类似 2)硬链接,相当于多了一个文件名指向同一块内存空间,目录无法创建硬链接,不可 ...