sed - 6 Hold Space简介

前篇回顾
sed - 简介 读取编辑文字档的好工具
sed - 2 Pattern
sed - 3 Delete command
sed - 4 Write commands
sed - 5 Replace command

之前讲到的sed工作流程, 其实还有个Hold Space, 一个保留空间, 预设是保留上一行的行内容
https://ithelp.ithome.com.tw/upload/images/20210921/20104930D96jrxyrMu.png
有了这HoldSpace, 我们能做到更多样化的操作.
试想一下有上一行的内容, 又有当前该行的内容, 这两个暂存能做什麽?
Swap就能作到交换两边空间的资料

先列举能影响到Hold Space的几个常见Command

  • x : 把Pattern Space与Hold Space做交换(exchange)
  • h : 复制pattern space 到hold space (就是覆盖过去)
  • H : 追加pattern space 到hold space
  • g : 复制hold space 到 pattern space
  • G : 追加hold space 到 pattern space

这里还得多介绍几个Command

  • n : 读取下一行到pattern space
  • N : 追加读取下一行pattern space, 并且把这两行当作一行, 两行中间依然保有第一行的\n换行符号
  • q : 结束sed
  • d : 清空目前的pattern space
  • D : 删除目前pattern sapce, 遇到\n为止

尝试把以下内容的前两行位子做互换

Windows
Linux
echo 'WIndows\nLinux' | sed  '1!G;h;$!d'  
> Linux
> WIndows

我们来一步一步拆解'1!G;h;$!d', 多个command用;做分隔
先看第一个command1!G, !是否定的意思, 所以这动作就是第1行不做G的动作.
第二个command就是h.
最後一个command是$!d, $是最末行, 所以就代表最末行不做d的动作.

将第一行Windows读入pattern space
https://ithelp.ithome.com.tw/upload/images/20210922/201049302JRnQvQpul.png

开始执行commands, 第一个1!G因为是第一行不做;
接着执行第二个commandh, 将pattern space的内容复制到hold space
https://ithelp.ithome.com.tw/upload/images/20210922/20104930k4dNno78G8.png

然後执行最後一个command$!d, 因为不是最末行所以执行, 把pattern space给清空
https://ithelp.ithome.com.tw/upload/images/20210922/20104930FPVCq4sdf4.png
然後这行没有EOF, 继续读取下一行
将第二行Linux读入patttern space
https://ithelp.ithome.com.tw/upload/images/20210922/20104930Z9pEFD8GuU.png

开始执行commands, 执行1!G把hold space的内容追加到pattern space
https://ithelp.ithome.com.tw/upload/images/20210922/20104930H9L7T2DEw4.png

接着执行第二个commandh, 将pattern space的内容复制到hold space
https://ithelp.ithome.com.tw/upload/images/20210922/2010493011BdkoKQqX.png

接着执行最後一个command$!d, 因为是最末行所以不执行,
此时pattern space, 内容是Linux -> Windows,
碰到EOF就将pattern space的内容做输出
https://ithelp.ithome.com.tw/upload/images/20210922/20104930rd0BOLJtHS.png

多点内容, 会发现这条命令其实就是倒序

echo 'WIndows\nLinux\nAndroid\nOS' | sed  '1!G;h;$!d' 
> OS
> Android
> Linux
> WIndows

再来,跟Hold space无关, 只是用上面的讲解方法, 讲解只输出最後一行

echo 'WIndows\nLinux' | sed  'N;D'       
> Linux

一样来做command分解
先把第一行Windows读入pattern space
https://ithelp.ithome.com.tw/upload/images/20210922/20104930ou8JZifBM3.png

遇到第一个commandN,
追加读取下一行pattern space, 并且把这两行当作一行, 两行中间依然保有第一行的\n换行符号
https://ithelp.ithome.com.tw/upload/images/20210922/20104930sRjJijFqYb.png

然後执行最後一个commandD 删除目前pattern sapce, 遇到\n为止
所以Windows\n就被删除, 只剩下Linux, 如下图
https://ithelp.ithome.com.tw/upload/images/20210922/20104930LxE34YzxGN.png
碰到EOF就将pattern space的内容做输出

一样来多点内容, 会发现这条命令其实就是只输出最後一行

echo 'WIndows\nLinux\nAndroid\nOS' | sed  'N;D' 
> OS

<<:  [Day 14] 用 MLFlow 记录模型实验,就。很。快

>>:  [第14天]理财达人Mx. Ada-盘中零股交易(Intraday Odd Order)

DAY30 後记

30天铁人赛到今天就结束了,其实中途遇到很多的问题,因为我平时还有其他工作要做所以写铁人的时间都很赶...

[Day14] Storybook - Colors & Typography

Storybook 除了可以为元件攥写 Story 以外,也可以攥写纯内容的说明文件,不过纯内容的说...

[Python 爬虫这样学,一定是大拇指拉!] DAY18 - Python:Requests 基本应用 (1)

实战演练开始前,稍微来讲解一下 Requests 的基本使用,当作是暖身。 用 Requests 送...

第六天:首次启动设定

若是您选择以软件包或 Docker 这种 On Premises 的安装方式安装在本机电脑的话,那首...

【zerojudge恶龙题】- c005: 10300 - Ecological Premium

这题对Python来说很友善,直接算就好了 每笔奖金算法 [(农场的面积/农场里动物的数目) * 农...