sed ‘N,P,D,lable循环’高级应用综合实例

有一文本如下:

我想把文本格式变成姓名加成绩格式,图示如下:

自己捣鼓好久,用几条命令实现,具体如下:

群里的大神,也写了条命令,如下:

相当V5给力的一条sed命令。

看得云里雾里的。刚好比较有得闲,仔细学习研究了2天时间,终于理解了。特意记录下理解过程,具体如下:

命令:sed ‘:1;N;/\n[A-Za-z]/!s/\n/ /;t1;P;D‘

具体解释:

:1到t1,这是一个循环,用到的是 sed t lable,

N,追加下一行进入匹配空间。

/\n[A-Za-z]/!s/\n/ /,/\n[A-Za-z]/匹配任意一个\n(换行符)加英文字母。!不执行,s/\n/ /,删除换行符。这条命令整个的意思是,不匹配\n[A-Za-z]的行,删除\n(换行符)。

P,打印多行匹配空间的第一行。

D,删除多行匹配空间的第一行。

N,P,D结合使用,建立一个输入输出循环,维护两行的匹配空间,只输出第一行,然后返回脚本的顶端,将所有命令用于匹配空间的第二行。请重点注意这点。NPD三个都写了就形成个循环,不能单独分析N或者P或者D。

具体执行过程:

先看文本:

命令:sed ‘:1;N;/\n[A-Za-z]/!s/\n/ /;t1;P;D‘

1.设立:1 label标识。

2.读入文本第一行 am

3.执行N,读入下一行 99到匹配空间 现在匹配空间的内容为 am \n 99

4.执行匹配,不匹配,因此删除 \n,匹配空间为变为  am 99

5.设置的结束循环的条件为:/\n[A-Za-z]/,暂时没有匹配到这个条件,执行t1,回到命令顶端1。

6.读入下一行,依次执行上面的顺序。

7.从am 到76,全部执行一遍,匹配空间的内容为 am 99 100 80 76

8.读到yx这行的时候,匹配空间内容为 am 99 100 80 76 \n yx,注意:\nyx匹配/\n[A-Za-z]/,循环打破,执行P,D。

9.重点:前面的N必须和P和D一起综合起来理解。输出匹配空间的第一行:am 99 100 80 76。匹配空间的第二行:yx,重新开始顺序执行命令。

时间: 2025-01-08 01:32:11

sed ‘N,P,D,lable循环’高级应用综合实例的相关文章

Eclipse插件开发 学习笔记 PDF 第一篇到第四篇 免分下载 开发基础 核心技术 高级进阶 综合实例

<<Eclipse插件开发 学习笔记>>,本书由浅入深.有重点.有针对性地介绍了Eclipse插件开发技术,全书分为4篇共24章.第一篇介绍Eclipse平台界面开发的基础知识.包含SWT控件的使用.界面布局.事件处理等内容:第二篇是插件开发核心技术,主要介绍插件开发的核心知识要点,包含行为(Action).视图(ViewPart).编辑器(Editor).透视图(Perspective)等10章的内容.第三篇主要讲述插件开发的高级内容,包含开发高级内容.富client平台技术(R

oracle高级查询(实例基于scott用户四张表)

oracle高级查询(实例基于scott用户四张表) 分组查询 多表查询 子查询 综合实例 ======================================================================= scott用户的四张表(emp,dept,bonus,salgrade) 没有这四张表的可参考http://blog.csdn.net/love_legain/article/details/54311040进行创建 -----------------------

for循环 嵌套延时器 实例及解决方案

for循环 嵌套延时器 实例及解决方案 首先         看一个经典的for循环嵌套延时器的案例 for(var i = 0;i<lg;i++){// lg = 6 setTimeout(function(){ console.log(i); //此时输出为 6 个 6 },1000) } 我们想要的结果是在for循环中一次打印出 i 的 值.即0,1,2,3,4,5:但是输出6个相同的个数字是什么原因呢? 这主传进去要是因为setTimeout的执行时异步执行的,而for循环的执行却非常的

Volocity循环高级用法

#foreach($announcementDo in $announcementList) #if(($velocityCount - 1) % 3 == 0) <span style="display: none; bottom: 0px;"> #set($temps=$velocityCount - 1) <a target="_blank"> $!announcementList.get($temps).tilte <em st

5、判断、循环、数组综合练习案例(迷你DVD)

迷你dvd代码如下: 1 package com.manager; 2 3 import java.util.Scanner; 4 5 public class DVDManage { 6 public static void main(String[] args) { 7 Scanner input=new Scanner(System.in); 8 9 //1.定义dvd相关数组 10 String[] name=new String[6]; //DVD名称 11 int[] state=n

SQL 循环语句 while 介绍 实例

declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+1 end --------------- while 条件 begin 执行操作 set @i=@i+1 end --何问起 hovertree.com WHILE设置重复执行 SQL 语句或语句块的条件.只要指定的条件为真,就重复执行语句.可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE

JavaScript - 高级树形菜单实例

简单的树形菜单 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

iOS 循环引用 委托 (实例说明)

如何避免循环引用造成的内存泄漏呢: 以delegate模式为例(viewcontroller和view之间就是代理模式,viewcontroller有view的使用权,viewcontroller同时也是view的代理(处理view中的事件)): UserWebService.h #import //定义一个ws完成的delegate @protocol WsCompleteDelegate @required -(void) finished;//需要实现的方法 @end @interface

sed 命令及shell的if语句的运用实例

if [ -f /etc/syslog.conf ];     #判断文件是否存在thensystest=`sed -n  '/^auth.info/p' /etc/syslog.conf`;    #匹配/etc/syslog.conf文件中是否有auto.info字符串,并返回字符串,systest变量接收.if [ -n \"\$systest\" ];                                               #判断字符串是否存在thensed