windows ubuntu sed,awk,grep篇:7.sed 多行模式及循环

目录

46.读取下一行数据并附加到模式空间(命令 N)

47.打印多行模式中的第一行(命令 P)

48. 删除多行模式中的第一行(命令 D)

49.循环和分支(命令 b 和 :label 标签)

50.使用命令 t 进行循环


Sed 默认每次只处理一行数据,除非使用 H,G 或者 N 等命令创建多行模式,每行之间用换行
符分开。
本章将解释适用于多行模式的 sed 命令。
提示:在处理多行模式是,请务必牢记 ^ 只匹配该模式的开头,即最开始一行的开头,且 $
匹配该模式的结尾,即最后一行的结尾。

46.读取下一行数据并附加到模式空间(命令 N)

就像大写的命令 H G 一样,只会追加内容而不是替换内容,命令 N 从输入文件中读取下
一行并追加到模式空间,而不是替换模式空间。
前面提到过,小写命令 n 打印当前模式空间的内容,并清空模式空间,从输入文件中读取下
一行到模式空间,然后继续执行后面的命令。
大写命令 N ,不会打印模式空间内容,也不会清除模式空间内容,而是在当前模式空间内容
后加上换行符 \n, 并且从输入文件中读取下一行数据,追加到模式空间中,然后继续执行后
面的命令。
以分号分隔,打印雇员名称和职位 :
$ sed -e '{N;s/\n/:/}' empnametitle.txt
John Doe:CEO
Jason Smith:IT Manager
Raj Reddy:Sysadmin
Anand Ram:Developer
Jane Miller:Sales Manager
这个例子中 :
N 追加换行符 \n 到当前模式空间 ( 雇员名称 ) 的最后,然后从输入文件读取下一行数
据,追加进来。因此,当前模式空间内容变为 雇员名称 \n 雇员职位
s/\n/:/ 把换行符 \n 替换为分号,把分号作为雇员名称和雇员职位的分隔符
流程如下图所示 :
下面的例子将演示在打印 employee.txt 文件内容的同时,以文本方式显示每行的行号:
$ sed -e '=' employee.txt|sed '{N;s/\n/ /}'
1 101,Johnny Doe,CEO
2 102,Jason Smith,IT Manager
3 103,Raj Reddy,Sysadmin
4 104,Anand Ram,Developer
5 105,Jane Miller,Sales Manager
和之前的例子一样,命令 = 先打印行号,然后但印原始的行的内容。
这个例子中,命令 N 在当前模式空间后面加上 \n( 当前模式空间内容为行号 ), 然后读取下一行,
并追究到模式空间中。因此,模式空间内容变为 行号 \n 原始内容 。然后用 s/\n/ / 把换行符
\n 替换成空格。

47.打印多行模式中的第一行(命令 P)

目前为止,我们已经学会了三个大写的命令 (H,N,G) ,每个命令都是追加内容而不是替换内容。
现在我们来看看大写的 D P ,虽然他们的功能和小写的 d p 非常相似,但他们在多行模
式中有特殊的功能。
之前说到,小写的命令 p 打印模式空间的内容。大写的 P 也打印模式空间内容,直到它遇到
换行符 \n 下面的例子将打印所有管理者的名称 :
$ sed -n -e 'N' -e '/Manager/P' empnametitle.txt
Jason Smith
Jane Miller

48. 删除多行模式中的第一行(命令 D)

之前提到,小写命令 d 会删除模式空间内容,然后读取下一条记录到模式空间,并忽略后面
的命令,从头开始下一次循环。
大写命令 D ,既不会读取下一条记录,也不会完全清空模式空间 ( 除非模式空间内只有一行 )
它只会:
z 删除模式空间的部分内容,直到遇到换行符 \n
z 忽略后续命令,在当前模式空间中从头开始执行命令
假设有下面文件,没个雇员的职位都用 @ 包含起来作为注释。需要注意的是,有些注释是跨
行的。如 @Information Technology officer@ 就跨了两行。请先建立下面示例文件 :
$ vi empnametitle-with-commnet.txt
John Doe
CEO @Chief Executive Officer@
Jason Smith
IT Manager @Infromation Technology
Officer@
Raj Reddy
Sysadmin @System Administrator@
Anand Ram
Developer @Senior
Programmer@
Jane Miller
Sales Manager @Sales
Manager@
现在我们的目标是,去掉文件里的注释 :
$ sed -e '/@/{N;/@.*@/{s/@.*@//;P;D}}' empnametitle-with-commnet.txt
John Doe
CEO
Jason Smith
IT Manager
Raj Reddy
Sysadmin
Anand Ram
Developer
Jane Miller Sales Manager
也可把上述命令写到 sed 脚本中然后执行 :
$ vi D-upper.sed
#!/bin/sed -f
/@/{
N
/@.*@/{s/@.*@//;P;D}
}
$ chmod u+x D-upper.sed
$ ./D-upper.sed empnametitle-with-commnet.txt
John Doe
CEO
Jason Smith
IT Manager
Raj Reddy
Sysadmin
Anand Ram
Developer
Jane Miller
Sales Manager
这个例子中 :
  /@/{ 这是外传循环。 Sed 搜索包含 @ 符号的任意行,如果找到,就执行后面的命
令;如果没有找到,则读取下一行。为了便于说明,以第 4 行,即 ”@Information
Technology”( 这条注释跨了两行 ) 为例,它包含一个 @ 符合,所以后面的命令会被执
行。
N 从输入文件读取下一行,并追加到模式空间,以上面提到的那行数据为例,这
N 会读取第 5 行,即 ”Officer@” 并追加到模式空间,因此模式空间内容变
”@Informatioin Technology\nOfficer@”
  /@.*@/ 在模式空间中搜索匹配 /@.*@/ 的模式 , 即以 @ 开头和结尾的任何内容。当
前模式空间的内容匹配这个模式,因此将继续执行后面的命令。
  s/@.*@//;P;D 这个替换命令把整个 @Information Technology\nOfficer@” 替换为空
( 相当于删除 ) P 打印模式空间中的第一行,然后 D 删除模式空间中的第一行,然
后从头开始执行命令 ( 即不读取下一条记录,又返回到 /@/ 处执行命令 )

49.循环和分支(命令 b :label 标签)

使用标签和分支命令 b ,可以改变 sed 的执行流程:
  :label 定义一个标签
b lable 执行该标签后面的命令。 Sed 会跳转到该标签,然后执行后面的命令。
  注意:命令 b 后面可以不跟任何标签,这种情况下,它会直接跳到 sed 脚本的结尾 下面例子将把 empnametitle.txt 文件中的雇员名称和职位合并到一行内,字段之间以分号:
分隔,并且在管理者的名称前面加上一个星号 *
$ cat label.sed
#!/bin/sed -nf
h;n;H;x
s/\n/:/
/Manager/!b end
s/^/*/
:end
p
这个脚本中,鉴于之前的例子,你已经知道 h;n;H;x s/\n/:/ 的作用了。下面是关于分支的
操作:
z /Manager/!b end 如果行内不包含关键字 ”Manager”, 则 跳转到 ’end’ 标签,请注意,
你可以任意设置你想要的标签名称。因此,只有匹配 Manager 的雇员名称签名,
才会执行 s/^/*/( 在行首加上星号 *)
z :end 即是标签
给这个脚本加上可执行权限,然后执行:
$ chmod u+x label.sed
$ ./label.sed empnametitle.txt
John Doe:CEO
*Jason Smith:IT Manager
Raj Reddy:Sysadmin
Anand Ram:Developer
*Jane Miller:Sales Manager
个人觉得脚本里面的 h;n;H;x 可以用一个 N 替代,这样就不用使用保持空间了。
如果不使用标签,还可以: sed 'N;s/\n/:/;/Manager/s/^/\.*/' empnametitle.txt

50.使用命令 t 进行循环

命令 t 的作用是,如果前面的命令执行成功,那么就跳转到 t 指定的标签处,继续往下执行
后续命令。否则,仍然继续正常的执行流程。
下面例子将把 empnametitle.txt 文件中的雇员名称和职位合并到一行内,字段之间以分号:
分隔,并且在管理者的名称前面加上三个星号 *
提示:我们只需把前面例子中的替换命令改为 s/^/***/即可带到该目的,下面这个例子仅仅
是为了解释命令 t 是如何运行的。
$ vi lable-t.sed
#!/bin/sed -nf
h;n;H;x
s/\n/:/
: repeat
/Manager/s/^/*/
/\*\*\*/! t repeat
p
$ chmod u+x lable-t.sed
$ ./lable-t.sed empnametitle.txt
John Doe:CEO
***Jason Smith:IT Manager
Raj Reddy:Sysadmin
Anand Ram:Developer
***Jane Miller:Sales Manager
这个例子中 :
下面的代码执行循环
:repeat
/Manager/s/^/*/
/\*\*\*/! t repeat
  /Manager/s/^/*/ 如果匹配到 Manager, 在行首加上星号 *
  /\*\*\*/!t repeat 如果没有匹配到三个连续的星号 *( /\*\*\*/! 来表示 ) ,并且前面
一行的替换命令成功执行了,则跳转到名为 repeat 的标签处 ( t repeat)
  :repeat 标签

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

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

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

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

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

相关文章

python学习笔记B-11:序列结构之列表--二维列表的遍历和生成式

二维列表的遍历方式,使用双层for循环,遍历索引号。 二维列表的生成式,也是使用类似双层循环的形式生成。 print("##初始化二维列表,每个元素就是1个列表") lst [["东方延续","太空军自然选择号舰长&qu…

释放Stable Diffusion 无限可能

最近在整理大语言模型的系列内容,Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion,是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布,主要用于根据文本的描述产生详细图像&…

基于SpringBoot+Vue笔记记录分享网站设计与实现

项目介绍: 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代…

C语言 | Leetcode C语言题解之第50题Pow(x,n)

题目&#xff1a; 题解&#xff1a; double myPow(double x, int n){if(n 0 || x 1){return 1;}if(n < 0){return 1/(x*myPow(x,-(n1)));}if(n % 2 0){return myPow(x*x,n/2);}else{return x*myPow(x*x,(n - 1)/2);} }

【Jenkins】持续集成与交付 (三):有关报错解决(Jenkins (2.387.3) or higher required)

🟣【Jenkins】持续集成与交付 (三):有关报错解决Jenkins (2.387.3) or higher required 一、Jenkins主页报错二、安装Jenkins插件报错三、解决过程(解压替换jenkins.war)四、重新访问登录💖The Begin💖点点关注,收藏不迷路💖 一、Jenkins主页报错 New version …

吴恩达2022机器学习专项课程(一)7.2 逻辑回归的简化成本函数

问题预览/关键词 本节课内容逻辑回归的损失函数简化之后的形式是&#xff1f;为什么可以简化&#xff1f;成本函数的通用形式是&#xff1f;逻辑回归成本函数的最终形式是&#xff1f;逻辑回归为什么用对数损失函数计算成本函数&#xff1f;为什么不直接给出逻辑回归损失函数的…

[详解]Spring AOP

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 什么是AOP? Spring AOP 快速入门 Spring AOP核心概念 切点(Point…

selenium 4.x入门篇(环境搭建、八大元素定位)

背景 Web自动化测现状 1. 属于 E2E 测试 2. 过去通过点点点 3. 好的测试&#xff0c;还需要记录、调试网页的细节 一、selenium4.x环境搭建 一键搭建 pip3 install webdriver-helper 安装后自动的完成&#xff1a; 1. 查看浏览器的版本号 2. 查询操作系统的类型…

【智能优化算法】蚱蜢优化算法(Grasshopper Optimization Algorithm,GOA)

蚱蜢优化算法(Grasshopper Optimization Algorithm&#xff0c;GOA)是期刊“IEEE Access”&#xff08;IF 3.9&#xff09;的2021年智能优化算法 01.引言 蚱蜢优化算法(Grasshopper optimization algorithm, GOA)&#xff0c;并将其应用于结构优化中的挑战性问题。该算法在数学…

Microsoft Edge浏览器:高效、简洁、个性化的网页浏览体验

Microsoft Edge是微软公司推出的一款网络浏览器&#xff0c;它是基于Chromium开源项目开发的&#xff0c;因此与Google Chrome有很多相似之处。以下是一些使用Microsoft Edge的心得体会&#xff1a; 1. 界面简洁&#xff1a;Microsoft Edge的界面设计非常简洁&#xff0c;用户…

华为od入职第13天!

今天早上就分配活了&#xff0c;写一个模块的ut&#xff0c;但是今天一句代码没写成&#xff0c;一直在看代码逻辑。下午就是新员工的一个会&#xff0c;部门20来个人做一下自我介绍啥的。晚上我导师给我们几个新员工讲项目框架和一些代码逻辑啥的&#xff0c;讲了一个多小时&a…

区块链技术与应用学习笔记(5-7节)——北大肖臻课程

​ 目录 ​BTC实现 基于交易的账本模式&#xff1a; UTXO集合&#xff1a; 交易费用&#xff1a; BTC网络 1.应用层&#xff1a; 2.网络层&#xff1a; 3传播层&#xff1a; 什么是鲁棒&#xff1f; BTC挖矿&#xff1a; 出块奖励&#xff1a; 挖矿难度调整&#…

Python | Leetcode Python题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; class Solution:def solveNQueens(self, n: int) -> List[List[str]]:def generateBoard():board list()for i in range(n):row[queens[i]] "Q"board.append("".join(row))row[queens[i]] "."return b…

【C语言刷题系列】对数字添加逗号

目录 一、问题描述 二、解题思路 三、源代码 拓展&#xff1a; 个人主页&#xff1a; 倔强的石头的博客 系列专栏 &#xff1a;C语言指南 C语言刷题系列 一、问题描述 二、解题思路 题目的要求&#xff0c;即对于一个较大的整数&#xff0c;每三位数字之间添加…

CSS + HTML

目录 一.CSS&#xff08;层叠样式表&#xff09; 二. CSS 引入方式 三.选择器 3.1 标签选择器 3.2 类选择器 3.3 id选择器 3.4 通配符选择器 3.5 画盒子 四.文字控制属性 4.1字体大小 4.2字体粗细 4.3 字体倾斜 4.4行高 4.5行高--垂直居中 4.6 字体族 4.7 字体复…

使用mmdetection来训练自己的数据集(visdrone)(四)结果分析

测试 python tools/test.py <your-config-file> <your-model-weights-file> --out <save-pickle-path>关于test.py 的命令行 parser.add_argument(--out,typestr,helpdump predictions to a pickle file for offline evaluation)计算量、参数量计算脚本 pyth…

【自然语言处理】Word2VecTranE的实现

作业一 Word2Vec&TranE的实现 1 任务目标 1.1 案例简介 Word2Vec是词嵌入的经典模型&#xff0c;它通过词之间的上下文信息来建模词的相似度。TransE是知识表示学习领域的经典模型&#xff0c;它借鉴了Word2Vec的思路&#xff0c;用“头实体关系尾实体”这一简单的训练目…

【Linux】dlopen: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29‘ not found

[30116] Error loading Python lib /tmp/_MEIlvdUu6/libpython3.8.so.1.0: dlopen: /lib/x86_64-linux-gnu/libm.so.6: version GLIBC_2.29 not found (required by /tmp/_MEIlvdUu6/libpython3.8.so.1.0)1 cd到指定路径 cd /usr/local 2 下载 wget http://ftp.gnu.org/gnu/gl…

Ant Design助力:实现用户列表的优雅展示与管理

文章目录 概要前端讲解登录组件注册组件用户列表组件 后端讲解连接数据库db.js路由routes.jsexpress应用app.js 启动项目小结 概要 在上一篇博客&#x1f6aa;中&#xff0c;我们已经成功实现了登录注册系统的基本功能。现在&#xff0c;我们将进一步完善系统&#xff0c;实现…

ABAP Visual Code 新建sap系统连接

本文主要介绍如何新建SAP前端系统链接 前提是你已经都扩展完了 1.点击SAP fiori--》点击新建 2.选择 abap on premise 3.输入如下信息 4.这里介绍下URL 如何获取 SMICM-->点击service 明细里面可以看到你的host name 和 port 当然你也可以随便找一个你的odata 服务看下ur…