本篇介绍sed的高级编辑命令

高级编辑命令

P:打印模式空间开端至\n内容,并追加到默认输出之前

n: 读取匹配到的行的下一行覆盖至模式空间

N:读取匹配到的行的下一行追加至模式空间

h: 把模式空间中的内容覆盖至保持空间中

H:把模式空间中的内容追加至保持空间中

g: 从保持空间取出数据覆盖至模式空间

G:从保持空间取出内容追加至模式空间

x: 把模式空间中的内容与保持空间中的内容进行互换

d: 删除模式空间中的行,并进入下一个循环

D: 删除当前模式空间开端至\n的内容,放弃之后的命令,之后对模式空间剩余内容重新执行前面的命令,如果模式空间没有\n,则与d相同(之后会有详细说明)

关于多行:

被追加了行的空间,里面的内容被sed看做是被\n隔开的行:

如:

模式空间原有的行\n被追加的行

p/P命令:

都用于打印模式空间内容,两者区别:

小写p打印当前模式空间内容,追加到默认输出之后

大写P打印当前模式空间开始至\n的内容,并追加到默认输出之前。

n命令:

读取下一行,覆盖模式空间的前一行,如果期间任何命令执行失败,则停止运行后续命令.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取出文件中的偶数行

$ sed -n 'n;p' text
2b
4d
6f
8h

解析:

读取第一行1a,执行n命令,此时模式空间为2b,执行p,打印模式空间内容2p

读取第三行3c,执行n命令,此时模式空间为4d,执行p,打印模式空间内容4d

读取第五行5e,执行n命令,此时模式空间为6f,执行p,打印模式空间内容6f

读取第七行7g,执行n命令,此时模式空间为8h,执行p,打印模式空间内容8h

读取第九行9i,执行n命令,由于没有下一行,n命令执行失败,所以直接退出,不执行后续p命令.

所以最后输出结果即为全部偶数行

N命令:

读取并将下一行追加到模式空间,但把两行看做是含有\n换行符的一行,如果期间任何命令执行失败,则停止运行后续命令.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取出文件中的奇数行

$ sed -n '$!N;P' text  # -n 不显示默认输出
1a
3c
5e
7g
9i

解析:

读取第一行1a,不是最后一行,$!条件成立,执行N,取出下一行内容2b追加到1a之后,此时模式空间为1a\n2b,执行P,仅输出\n前内容,即1a

读取第三行3c,不是最后一行,$!条件成立,执行N,取出下一行内容4d追加到3c之后,此时模式空间为3c\n4d,执行P,仅输出\n前内容,即3c

读取第五行5e,不是最后一行,$!条件成立,执行N,取出下一行内容6f追加到5e之后,此时模式空间为5e\n6f,执行P,仅输出\n前内容,即5e

读取第七行7g,不是最后一行,$!条件成立,执行N,取出下一行内容8h追加到7g之后,此时模式空间为7g\n8h,执行P,仅输出\n前内容,即7g

读取第九行9i,因为最后一行,$!条件不成立,跳过执行N,直接执行P,即输出9i.

所以最后输出结果为全部奇数行.

注意匹配失败也是命令执行成功的一种结果,并非命令执行失败.

d命令:

删除模式空间的所有内容,并直接进入下一个循环.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取出文件中的奇数行

$ sed 'n;d' text
1a
3c
5e
7g
9i

解析:

读取第一行1a,执行命令n,此时模式空间内容为2b,执行d,模式空间清空,最后默认输出为没有被处理过的1a

读取第三行3c,执行命令n,模式空间为4d,执行d,模式空间空,默认输出3c

第五行....5e

第七行....7g

第九行9i,由于没有下一行,n执行失败,终止后续命令.默认输出9i

所以最终输出结果为所有奇数行

D命令:

删除模式空间开始到第一个\n的所有内容,结束后续命令,并使用模式空间剩余内容进入下一轮循环.

示例:

文件text的内容如下

1a

2b

3c

4d

5e

6f

7g

8h

9i

取文件最后一行

$ sed 'N;D' text
9i

解析:

读取第一行1a,执行N,模式空间内容为1a\n2b,执行D,模式空间剩下2b.

返回执行N,取出第三行3c,模式空间为2b\n3c,执行D,模式空间为3c

......

返回执行N,取出第九行9i,模式空间为8h\n9i,执行D,模式空间为9i

返回执行N,没有下一行,执行失败,不执行后续命令,默认输出模式空间内容9i.

最终输出结果为最后一行

H/G/h/g命令:

大写的H/G都为追加操作

H为模式空间追加到保持空间

G为保持空间追加到模式空间

小写的h/g都是覆盖操作

h为模式空间覆盖保持空间

g为保持空间覆盖模式空间

示例:

$ sed 'G' text #文件每一行之后插入空行
1a 2b 3c 4d 5e 6f 7g 8h 9i

解析:

保持空间是空,所以G追加到模式空间也就是空行了.

$ sed 'g' text #结果为9个空行

解析:

保持空间是空,把模式空间每一行都覆盖为空.

$ sed '1!G;$!h;$!d' text #逆序显示文件的行
9i
8h
7g
6f
5e
4d
3c
2b
1a

解析:

读取第一行1a,1!条件不成立,跳过G,执行h,模式空间中的1a覆盖到保持空间,$!成立执行d,删除模式空间内容,进入下个循环

读取第二行2b,1!条件成立,执行G,模式空间变为2b\n1a,执行h,覆盖到保持空间,$!成立,执行d,删除模式空间内容,进入下个循环

读取第三行3c,1!条件成立,执行G,模式空间变为3c\n2b\n1a,执行h,覆盖到保持空间,$!成立,执行d,删除模式空间内容,进入下个循环

....

读取最后一行9i,1!条件成立,执行G,模式空间变为9i\n8h\n7g\n6f\n5e\n4d\n3c\n2b\n1a,$!成立,跳过h,跳过d,默认输出模式空间内容.9i\n8h\n7g\n6f\n5e\n4d\n3c\n2b\n1a

其他示例:

使用含有模式的文件,将文件中的小写字母转换成大写,并将每一行的字母与数字交换位置

文件text的内容为

1a

2b

3c

4d

5e

6f

7g

8h

9i

$ cat pat
h
y/abcdefghi/ABCDEFGHI/
s@([0-9])([A-Z])@\2\1@ $ sed -rf pat text # -r 使用扩展正则,-f 指定含有模式的文件
A1
B2
C3
D4
E5
F6
G7
H8
I9

解析

第一步读取一行执行h,放入保持空间.

第二步把所有小写字母换成大写

第三步通过替换命令把字母和数字位置调换

文本number.txt中内容如下

$ cat numbers.txt
1
2
3
4
5
6
7
8
9

将文本文件的n和n+1行合并为一行,n为奇数行

$ sed 'N;s@\n@ @g' number.txt
1 2
3 4
5 6
7 8
9

解析:

读取第一行1,放入模式空间,执行N,模式空间为1\n2,执行s替换\n为空格,结果为1 2,默认输出1 2

读取第三行3,放入模式空间,执行N,模式空间为3\n4,执行s替换\n为空格,结果为3 4,默认输出3 4

.....

读取第九行9,执行N失败,不执行后续命令,默认输出9

每两行为一组倒序排列

$ seq 1 8 | sed -n '$!N;2!G;h;$p'
7
8
5
6
3
4
1
2

解析:

seq 结果为

1

2

3

4

5

6

7

8

读取第一行,$!成立,执行N,读取第二行内容追加到模式空间,模式空间为1\n2,因为已经读取到第2行,所以2!不成立,跳过G,执行h,保持空间为1\n2,不是最后一行,$不成立,不执行p不输出到屏幕

读取第三行,$!成立,执行N,读取第四行内容追加到模式空间,模式空间为3\n4,2!成立,执行G,把保持空间的1\n2追加到模式空间,此时模式空间为3\n4\n1\n2,执行h,覆盖到保持空间,再次跳过p输出

.........

读取第七行,$!成立,执行N,读取第八行内容追加到模式空间,模式空间为7\n8,2!成立,执行G,把保持空间的5\n6\n3\n4\n1\n2到模式空间,此时模式空间为7\n8\n5\n6\n3\n4\n1\n2,执行h,覆盖到保持间,这一步是多于的,可以在h前加$!跳过此步,最后因为是最后一行$成立,p成功执行,打印模式空间内容

文本处理三剑客之 Sed ——高级编辑命令的更多相关文章

  1. 文本处理三剑客之 Sed ——一般编辑命令

    sed简介 sed (stream editor for filtering and transforming text) 是Linux上的文本处理三剑客之一,另外两个是grep和awk. sed又称 ...

  2. 文本处理三剑客之sed命令

    第十八章.文本处理三剑客之sed命令 目录 sed介绍 sed命令常用选项 sed常用编辑命令 sed使用示例 sed高级语法 18.1.sed简介 sed全名stream editor,流编辑器,s ...

  3. 文本处理三剑客之sed

    sed 1.简介 sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(patternspace),接着用sed命令处理缓冲区中的内 ...

  4. Linux文本处理三剑客之sed

    推荐新手阅读[酷壳]或[骏马金龙]开篇的教程作为入门.骏马兄后面的文章以及官方英文文档较难. [酷壳]:https://coolshell.cn/articles/9104.html [骏马金龙-博客 ...

  5. 文本处理三剑客之 sed详解

    1.简介 sed是非交互式的编辑器,它不会修改文件,除非使用shell重定向来保存结果.默认情况下,所有的输出行都被打印到屏幕上. sed编辑器逐行处理文件(或输入),并将结果发送到屏幕.具体过程如下 ...

  6. 文本处理三剑客之 sed

    sed:文本流编辑器 主要是对文件的快速增删改查,查询功能中最常用的是过滤,取行 sed [选项] [sed内置命令字符] [输入文件] Options: -n:取消默认的sed输出,常与sed内置命 ...

  7. sed 流编辑命令

    1.命令功能 sed非交互式的流编辑器,sed不会修改源文件内容,除非重定向来保存输出结果:默认情况下所有的输出行都将被打印到屏幕上. 2.语法格式 sed  [option]  {script-on ...

  8. 4.shell编程-文本处理三剑客之sed

    4.1.sed的选项 sed,流编辑器.对标准输出或文件进行逐行处理. 语法格式 第一种:stdout | sed [option] "pattern command" 第二种:s ...

  9. linux下文本三剑客之sed

    继上一篇对正则表达式以及linux三剑客grep的讲解后,这一篇对sed重点介绍. 一.sed简介   sed表示流编辑器(Stream Editor).这是一个简单但功能强大的工具,分析文本,并无缝 ...

随机推荐

  1. JetBrains PyCharm(Professional版本)的下载、安装和初步使用

    不多说,直接上干货! 首先谈及这款软件,博主我用的理由:搞机器学习和深度学习! 想学习Python的同学们,在这里隆重介绍一款 Python 的开发工具 pyCharm IDE.这是我最喜欢的 Pyt ...

  2. Microsoft Azure 配置负载均衡

    负载均衡大家都知道是什么了吧,就不用介绍了.如何在 microsoft Azure 上配置了?创建两台虚拟机,并加入如云服务.然后在远处登录上去,有时你想在两台虚拟机上通信,怎么办,比如mymv2 p ...

  3. npm update常用命令使用

    一.更新 npm-check检查更新 npm install -g npm-check npm-check 2. npm-upgrade更新 npm install -g npm-upgrade np ...

  4. 栈C++实现

    栈的核心是LIFO(Last In First Out),即后进先出 出栈和入栈只会对栈顶进行操作,栈底永远为0.如果是入栈,要将入栈元素赋值给栈数组,再将栈顶上移一位:出栈时要先将栈顶下移一位,再将 ...

  5. Golang教程:Map

    什么是 map? Map 是 Go 中的内置类型,它将键与值绑定到一起.可以通过键获取相应的值. 如何创建 map? 可以通过将键和值的类型传递给内置函数 make 来创建一个 map.语法为:mak ...

  6. [android] 天气app布局练习(四)

    主要练习一下获取网络数据和解析xml MainActivity.java package com.example.weatherreport; import java.io.UnsupportedEn ...

  7. Java基础(9)——数组

    难点儿的已经过去啦,现在又开始基础了哈~ 之前讲变量的时候,变量是一个个的呀~,那我要搞一串变量该啷个办呢?Java给我们出了个好东西叫数组(*^▽^*) 数组呢,就是将变量一组一组的存起来,这个也是 ...

  8. 纯手写实现HashMap

    1.hashmap的实现 ① 初始化 1)定义一个Node<K, V>的数组来存放元素,但不立即初始化,在使用的时候再加载 2)定义数组初始大小为16 3)定义负载因子,默认为0.75, ...

  9. 关于request请求的基本获取

      1.Request对象的作用是与客户端交互,收集客户端的Form.Cookies.超链接,或者收集服务器端的环境变量. request对象是从客户端向服务器发出请求,包括用户提交的信息以及客户端的 ...

  10. LeetCode Find Peak Element [TBD]

    说要写成对数时间复杂度,算了想不出来,写个O(n)的水了 class Solution { public: int findPeakElement(const vector<int> &a ...