windows ubuntu sed,awk,grep篇,6.sed 保持空间和模式空间命令

目录

41.用保持空间替换模式空间(命令 x)

42.把模式空间的内容复制到保持空间(命令 h)

43.把模式空间内容追加到保持空间(命令 H)

44.把保持空间内容复制到模式空间(命令 g)

45.把保持空间追加到模式空间(命令 G)


Sed 有两个内置的存储空间:
z 模式空间:如你所知,模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一
个缓冲区,用来存放、修改从输入文件读取的内容。
z 保持空间:保持空间是另外一个缓冲区,用来存放临时数据。Sed 可以在保持空间
和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。我们已经讨论
过,每次循环读取数据过程中,模式空间的内容都会被清空,然而保持空间的内容
则保持不变,不会在循环中被删除。
请先建立如下文件,以用于保持空间的示例:
$ vi empnametitle.txt
John
Doe
CEO
Jason Smith
IT Manager
Raj Reddy
Sysadmin
Anand Ram
Developer
Jane Miller
Sales Manager
可以看到,在这个文件中,每个雇员的名称和职位位于连续的两行内。

41.用保持空间替换模式空间(命令 x)

命令 x(Exchange) 交换模式空间和保持空间的内容。该命令本身没有多大用处,但如果和其
他命令配合使用,则非常强大了。
假定目前模式空间内容为 ”line 1” ,保持空间内容为 ”line 2” 。那么执行命令 x 后,模式空间的
内容变为 ”line 2”, 保持空间的内容变为 ”line 1”
下面的例子打印管理者的名称,它搜索关键字’Manager’并打印之前的那一行:
$ sed –n -e '{x;n}’ –e ‘/Manager/{x;p}' empnametitle.txt
Jason Smith
Jane Miller
上面命令也可写成 : sed -n 'x;n;/Manager/{x;p}' empnametitle.txt
提示: 如果你的 empnametitle.txt 文件,雇员名称和职位不是连续的,那么得不到上面的结
果。
上面例子中 :
z {x;n} – x 交换模式空间和保持空间的内容; n 读取下一行到模式空间。在示例文件
中,保持空间保存的是雇员名称,模式空间保存的是职位。
z /Manager/{x;} 如果当前模式空间的内容包含关键 ’Manager’ ,那么就交换保持空
间和模式空间的内容,然后打印模式空间的内容。这就意味着,如果雇员职位中包
Manager, 那么该雇员的名称将被打印出来。
你也可以把上述命令保存在 sed 脚本中,然后执行,如下所示:
$ vim x.sed
#!/bin/sed -nf
x;n
/Manager/{x;p}
$ chmod u+x x.sed
$ ./x.sed empnametitle.txt
Jason Smith
Jane Miller

42.把模式空间的内容复制到保持空间(命令 h)

命令 h(hold) 把模式空间的内容复制到保持空间,和命令 x 不同,命令 h 不会修改当前模式
空间的内容。执行命令 h 时,当前保持空间的内容会被模式空间的内容覆盖。
假定目前模式空间内容为 ”line 1” ,保持空间内容为 ”line 2” 。那么执行命令 h 后,模式空间
的内容仍然为 ”line 1”, 保持空间的内容则变为 ”line 1”
打印管理者的名称:
$ sed -n -e '/Manager/!h' -e '/Manager/{x;p}' empnametitle.txt
Jason Smith
Jane Miller
上面例子中:
z /Manager/!h 如果模式空间内容不包含关键字 ’Manager’( 模式后面的 ! 表示不匹配
该模式 ) ,那么复制模式空间内容到保持空间。 ( 这样一来,保持空间的内容可能会
是雇员名称或职位,而不是 ’Manager’.) 注意,和前面的例子不同,这个例子中没有
使用命令 n 来获取下一行,而是通过正常的流程来读取后续内容。
z /Manager/{x;p} 如果模式空间内容包含关键字 ’Manager’ ,那么交换保持空间和模
式空间的内容,并打印模式空间的内容。这和我们在命令 x 的示例中的用法是相同
的。
你也可以把上面命令保存到 sed 脚本中执行:
$ vi h.sed
#!/bin/sed -nf
/Manager/!h
/Manager/{x;p}
$ chmod u+x h.sed
$ ./h.sed empnametitle.txtJason Smith
Jane Miller

43.把模式空间内容追加到保持空间(命令 H)

大写 H 命令表示把模式空间的内容追加到保持空间,追加之前保持空间的内容不会被覆盖;
相反,它在当前保持空间内容后面加上换行符 \n ,然后把模式空间内容追加进来。
假定目前模式空间内容为 ”line 1” ,保持空间内容为 ”line 2” 。那么执行命令 H 后,模式空间
的内容没有改变,仍然为 ”line 1”, 保持空间的内容则变为 ”line2\nline 1”
打印管理者的名称和职位(在不同的行上):
$ sed -n -e '/Manager/!h' -e '/Manager/{H;x;p}' empnametitle.txt
Jason Smith
IT Manager
Jane Miller
Sales Manager
上面例子中 :
z /Manager/!h 如果模式空间内容不包含关键字 ’Manager’( 模式后面的 ! 表示不匹配
该模式 ) ,那么复制模式空间内容到保持空间。 ( 这样一来,保持空间的内容可能会
是雇员名称或职位,而不是 ’Manager’.) 。这和之前使用命令 h 的方法是一样的。
z /Manager/{H;x;p} 如果模式空间内容包含关键字 ’Manager’ ,那么命令 H 把模式空
间的内容 ( 也就是管理者的职位 ) 作为新行追加到保持空间,所以保持空间内容会变
雇员名称 \n 职位 ”( 职位包含关键字 Manager) 。然后命令 x 交换模式空间和保持
空间的内容,随后命令 p 打印模式空间的内容。
你也可以把上面命令保存到 sed 脚本中执行:
$ vi H-upper.sed
#!/bin/sed -nf
/Manager/!h
/Manager/{H;x;p}
$ chmod u+x H-upper.sed
$ ./H-upper.sed empnametitle.txt
Jason Smith
IT Manager
Jane Miller
Sales Manager如果想把雇员名称和职位显示在同一行,以分号分开,那么只需稍微修改一下即可,如下:
$ sed -n -e '/Manager/!h' -e '/Manager/{H;x;;s/\n/:/p}' empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager
这个例子除了在第二个 -e 后面的命令中加入了替换命令之外,和前面的例子一样。 H x
p 都完成和之前相同的操作;在交换模式空间和保持空间之后,命令 s 把换行符 \n 替换为分
号,然后打印出来。
你也可以把上面命令保存到 sed 脚本中执行:
$ vi H1-upper.sed
#!/bin/sed -nf
/Manager/!h
/Manager/{H;x;s/\n/:/;p}
$ chmod u+x H1-upper.sed
$ ./H1-upper.sed empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager

44.把保持空间内容复制到模式空间(命令 g)

命令 g(get) 把保持空间的内容复制到模式空间。
这样理解:命令 h 保持 (hold) 住保持空间 (hold space) ,命令 g 从保持空间获取 (get) 内容。
假定当前模式空间内容为 ”line 1”, 保持空间内容为 ”line 2”; 执行命令 g 之后,模式空间内容变
”line 2” ,保持空间内容仍然为 ”line 2”
打印管理者的名称:
$ sed -n -e '/Manager/!h' -e '/Manager/{g;p}' empnametitle.txt
Jason Smith
Jane Miller
上面例子中 :
z /Manager/!h 最近几个例子都在用它。如果模式空间内容不包含关键字 ’Manager’,
那么就把他复制到保持空间。
z /Manager/{g;p} 把保持空间的内容丢到模式空间中,然后打印出来
你也可以把上面命令保存到 sed 脚本中执行:
$ vi g.sed#!/bin/sed -nf
/Manager/!h
/Manager/{g;p}
$ chmod u+x g.sed
$ ./g.sed empnametitle.txt
Jason Smith
Jane Miller

45.把保持空间追加到模式空间(命令 G)

大写 G 命令把当前保持空间的内容作为新行追加到模式空间中。模式空间的内容不会被覆
盖,该命令在模式空间后面加上换行符 \n ,然后把保持空间内容追加进去。
G g 的用法类似于 H h ;小写命令替换原来的内容,大写命令追加原来的内容。
假定当前模式空间内容为 ”line 1” ,保持空间内容为 ”line 2”; 命令 G 执行后,模式空间内容变
”line 1\nline 2”, 同时保持空间内容不变,仍然为 ”line 2”
以分号分隔,打印管理者的名称和职位:
$ sed -n -e '/Manager/!h' -e '/Manager/{x;G;s/\n/:/;p}' empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager
上面例子中:
z /Manager/!h 和前面的例子一样,如果模式空间内容不包含关键字 ’Manager’, 那么
就把他复制到保持空间。
z /Manager/{x;G;s/\n/:/;p} 如果模式空间包含 ’Manager’, 那么 :
x 交换模式空间和保持空间的内容。
G 把保持空间的内容追加到模式空间。
s/\n/:/ -- 在模式空间中,把换行符替换为分号 :
p 打印模式空间内容
注意:如果舍去命令 x ,即使用 /Manager/{G;s/\n/:/;p}, 那么结果会由
雇员职位 : 雇员名称 变成 雇员名称 : 雇员职位
也可把上述命令写到 sed 脚本中然后执行:
$ vi G-upper.sed
#!/bin/sed -nf
/Manager/!h
/Manager/{x;G;s/\n/:/;p}
$ chmod u+x G-upper.sed$ ./G-upper.sed empnametitle.txt
Jason Smith:IT Manager
Jane Miller:Sales Manager

资料来源于《SedandAwk101Hacks》,大家有兴趣可以买一本,也可以关注我,我更新完它。

曾经,我花费大半月将它们跑完,现在啥都忘了,还是要常用。

只为学习交流,不为获利,侵权联系立删。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

<计算机网络自顶向下> Internet Protocol

互联网中的网络层 IP数据报格式 ver: 四个比特的版本号(IPV4 0100, IPV6 0110) headlen:head的长度(头部长度字段(IHL)指定了头部的长度,以32位字(4字节)为单位计算。这…

怎么理解JavaScript原型、原型链

原型 JavaScript被描述为一种基于原型的语言,也就是每一个对象都拥有一个原型对象。 当我们访问一个对象的属性时,它不仅仅该改对象上查找,还会到这个对象的原型上查找,甚至是到这个对象的原型的原型上查找,这样一层…

Java数组深度剖析:掌握数据结构的基石

引言 在编程世界中,数仅仅是一种数据类型,它是理解内存分配、多维数据处理以及性能优组像是构建复杂数据结构的基本积木。它们简洁、高效,是管理元素集的首选方式。在Java中,数组不化的关键。 这篇文章致力于深入探讨Java数组的各…

git出错、文件无法删除、文件无法访问、文件或目录损坏且无法读取 等相关问题处理

一、错误历程与解决方案 1. 在用idea时,突然出现 部分git的命令无法使用,提示错误 2. 尝试删除项目文件夹,重新从git拉取代码 3.发现无法删除文件夹,删除操作没有任何反应,但是可以对文件夹重命名。 4.重新clone g…

李沐70_bert微调——自学笔记

微调BERT 1.BERT滴哦每一个词元返回抽取了上下文信息的特征向量 2.不同的任务使用不同的特性 句子分类 将cls对应的向量输入到全连接层分类 命名实体识别 1.识别应该词元是不是命名实体,例如人名、机构、位置 2.将非特殊词元放进全连接层分类 问题回答 1.给…

QT c++ 代码布局原则 简单例子

本文描述QT c widget代码布局遵循的原则:实中套虚,虚中套实。 本文最后列出了代码下载链接。 在QT6.2.4 msvc2019编译通过。 所谓实是实体组件:比如界面框、文本标签、组合框、文本框、按钮、表格、图片框等。 所谓虚是Layout组件&#x…

Redis哈希槽和一致性哈希

前言 单点的Redis有一定的局限: 单点发生故障,数据丢失,影响整体服务应用自身资源有限,无法承载更多资源分配并发访问,给服务器主机带来压力,性能瓶颈 我们想提升系统的容量、性能和可靠性,就…

sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步

😊 作者: 一恍过去 💖 主页: https://blog.csdn.net/zhuocailing3390 🎊 社区: Java技术栈交流 🎉 主题: sentinel-1.8.7与nacos-2.3.0实现动态规则配置、双向同步 ⏱️ 创作时…

unity的特性AttriBute详解

unity的特性AttriBute曾经令我大为头疼。因为不动使用的法则,但是教程都是直接就写,卡住就不能继续学下去。令我每一次看到,直接不敢看了。 今天使用文心一言搜索一番,发现,恐惧都是自己想象的,实际上这个…

Kotlin泛型之 循环引用泛型(A的泛型是B的子类,B的泛型是A的子类)

IDE(编辑器)报错 循环引用泛型是我起的名字&#xff0c;不知道官方的名字是什么。这个问题是我在定义Android 的MVP时提出来的。具体是什么样的呢&#xff1f;我们看一下我的基础的MVP定义&#xff1a; interface IPresenter<V> { fun getView(): V }interface IVie…

Nodejs 第六十八章(远程桌面)

远程桌面 远程桌面&#xff08;Remote Desktop&#xff09;是一种技术&#xff0c;允许用户通过网络远程连接到另一台计算机&#xff0c;并在本地计算机上控制远程计算机的操作。通过远程桌面&#xff0c;用户可以在不同地点的计算机之间共享屏幕、键盘和鼠标&#xff0c;就像…

BKPUNIX

第二条等待寄存器同步&#xff0c;可以参考前边RTC框图部分。在图中可以看到有两个时钟&#xff0c;PCLK1和RTCCLK&#xff0c;PCLK1在主电源掉电时会停止&#xff0c;为了保证RTC主电源掉电正常工作&#xff0c;RTC里的寄存器都是在RTCCLK同步下进行变更的。当用PCLK驱动的总线…

宝塔面板安装教程(linux)

宝塔官网地址 宝塔官网linux安装地址 针对Ubuntu系统的安装命令&#xff1a; wget -O install.sh https://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh ed8484bec 安装过程中&#xff0c;中途会出现一个 Y&N ? 的选项&#xf…

OpenCV如何模板匹配

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现背投 下一篇 &#xff1a;OpenCV在图像中寻找轮廓 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入图像之间…

如何下载AndroidStudio旧版本

文章目录 1. Android官方网站2. 往下滑找到历史版本归档3. 同意软件下载条款协议4. 下载旧版本Androidstudio1. Android官方网站 点击 Android官网AS下载页面 https://developer.android.google.cn/studio 进入AndroidStuido最新版下载页面,如下图: 2. 往下滑找到历史版本归…

react怎么制作选项卡

在React中制作选项卡&#xff08;Tabs&#xff09;是一个常见的需求&#xff0c;下面是一个简单的步骤和示例代码&#xff0c;用于创建一个基本的选项卡组件。 首先&#xff0c;我们需要定义选项卡组件的状态和结构。每个选项卡都有一个标签&#xff08;label&#xff09;和一…

Golang Colly批量爬取小红书图片

语言:Golang 库:Iris/Colly 先看输入日志: Saved file: images\20240428190531_2_0.jpg It is image 20240428190532_2_1.jpg Saved file: images\20240428190532_2_1.jpg It is image 20240428190533_2_2.jpg Saved file: images\20240428190533_2_2.jpg It is image 2024…

一本书了解AI的下一个风口:AI Agent

在数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动现代社会前进的强劲引擎。 从智能手机的智能助手到自动驾驶汽车的精准导航&#xff0c;AI技术的应用已经渗透到生活的方方面面。 随着技术的飞速发展&#xff0c;我们正站在一个新的转折点上&#xff…

构建本地大语言模型知识库问答系统

MaxKB 2024 年 4 月 12 日&#xff0c;1Panel 开源项目组正式对外介绍了其官方出品的开源子项目 ——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品…

关于ListView的使用及其实现原理

ListView的使用 ListView的使用主要分为以下几个步骤&#xff1a; 布局定义&#xff1a; 在XML布局文件中定义ListView控件&#xff0c;为其指定ID&#xff0c;并设置相关属性&#xff0c;如宽度、高度等。 <ListView android:id"id/list_view" android:layout…