加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

高级sed编程

发布时间:2020-12-14 01:17:26 所属栏目:Linux 来源:网络整理
导读:sed编辑器提供的一些更高级的功能; 1、多行命令 sed依据是行来进行数据处理,但是有时候我们需要对多行进行处理,该如何进行呢? sed有3个命令用于多行处理:N,在数据流中添加下一行以创建用于处理的多行组;D,删除多行组中的单个行;P,打印多行组中的单

  sed编辑器提供的一些更高级的功能;

1、多行命令

  sed依据是行来进行数据处理,但是有时候我们需要对多行进行处理,该如何进行呢?

  sed有3个命令用于多行处理:N,在数据流中添加下一行以创建用于处理的多行组;D,删除多行组中的单个行;P,打印多行组中的单个行。

  1.1、next命令

    1、单行next命令

    next命令(n)修改了sed数据处理文本的方式(默认是一行一行处理的)

    删除 header所在行的,下一行;

$ sed /^$/d data1  #删除所有的空白行

    2、组合多行文本

    N 将文本的下一行添加到已经存在于模式空间的文本中。其效果类似于将数据流中两个文本行合并,添加到同一个模式空间中。

    将n回车 替换为 空格字符;

    短语跨行出现的时候,如何替换?

  1.2、多行删除命令

    D用来删除文本内容。但是如果跨行删除,就需要结合 N 命令一起完成;

$ sed  
> N
> /SystemnAdminstrator/D
>  data3

    删除第一行之前的空行示例:

$ sed /^$/{
> N
> /header/D
> } data5

  1.3、多行打印命令

    多行打印,N与P结合使用

$ sed -n > N
> /SystemnAdministrator/P
>  data3

2、保留空间

  pattern space模式空间是一个活动的缓冲区,它不是存储文本唯一可用空间。

  sed编辑器利用另一个称为保留空间(hold space)的缓冲区。5个命令与其相关

$ cat data2
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
$ sed -n /first/{    #选出first字符的行
> h  #选出行,放入到保留空间中
> p  #打印模式空间的内容
> n  #检索下一行的内容,并放入到模式空间中
> p  #打印模式空间的内容,现在的第二行内容
> g  #保留空间的内容返回到模式空间中,替换当前文本
> p  #打印模式空间的内容,它现在回到第一行数据
> } data2
This is the first data line.
This is the second data line.
This is the first data line.
$ sed -n /first/{
> h
> n
> p
> g
> p
> } data2
This is the second data line.
This is the first data line.

3、否定命令

  ! 感叹号,表示否定。

$ -n /header/!p data2
This is the first data line.
This is the second data line.
This is the last line.

  next命令中,sed编辑器不能对数据流中的文本的最后一行执行操作,因为最后一行没有下一行。可以使用感叹号修复这个问题:

$ sed {
> !N
> /System.Administrator/Desktop User/
> } data4

  还可以用于翻转数据文本的行的顺序。工作流程如下:

  (1)将第一行放到保留空间中

  (2)将文本的下一行放到模式空间中

  (3)将保留空间最佳到模式空间中

  (4)将模式空间放到保留空间

  (5)重复第2步到第4步,直至将所有行以相反的顺序放到保留空间。

  (6)检索行并打印它们。

$ sed -n {
> 1!G
> h
> $p
> } data2

4、更改命令流

  默认sed命令从头运行到尾结束,但是有时候我们需要改变这个运行环境;

  4.1、分支

    一些命令容许我们只在数据流的特定自己上执行一组命令。分支命令格式:

      [address]b [label]

    address:决定在哪行或哪些行执行分支命令;

    label:参数定义于何处分支。

$ sed {
> 2,3b    #跳过2,3两行为address
> s/This is/Is this/
> s/line./test?/
> } data2
$ sed {
> /first/b jump1  #出现first字符,则跳转到以jump1为标记的行
> s/ is/ might be/
> s/line/test/
> :jump1
> s/data/text/
> } data2

    sed脚本根据后面标签情况,还可以分支到出现在脚本前面的标签,这样创建一个循环效果:

$ echo "This,is,a,test,to,remove,commas." | sed -n {
> :start
> s/,//1p
> b start
> }

  4.2、测试

    t 命令用作测试。使用格式:

      [address]t [label]

    

5、模式替换

  5.1、与号

  5.2、替换个别单词

6、脚本中使用sed

  6.1、使用包过滤器

  6.2、重定向sed输出

7、创建sed工具

  7.1、双倍行距

  7.2、对可能有空行的文件使用双倍行距

  7.3、对文件中的行计数

  7.4、打印最后几行

  7.5、删除行

  7.6、删除HTML标记

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读