awk与sed:关于多行的样本

awk与sed:关于多行的样本

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

  几天前CSDN看到一个帖子
http://bbs.csdn.net/topics/390848841
,楼主贴了以下的问题:

    
    
  1. 例:
  2. 12345
  3. 67890
  4. 1234567890
  5. 123
  6. 4567890
  7. 怎样能把上面数据转换成
  8. 1234567890
  9. 1234567890
  10. 1234567890

    看了几位网友的回复。认为还是挺有意思,也收获了一些知识,由于部分网友仅仅给出了解决方法,没有解释下。我依据自己的理解,对几个答案解释下(不一定准确,错误之处请指正)

我觉得错的答案
1    首先楼主给出了一个他说调试不出来的答案:

    
    
  1. sed 's/(?!90)\n//g'

?!

应该是非pattern结尾的意思,这个答案应该是说把非90结尾的行的换行符换位空。

这个答案应该是不可行的。sed默认单行模式。一次处理一行,执行时发现,就算我们把换行符去掉了。sed命令结束后。还是将它当成完整的一行输出(也就是说,应该是自己主动又加上换行符了)
2.    有一位网友。认为其它答案太复杂,给出了以下的方法
sed ‘N;s/\n//g’

    
    这个答案使用了sed的多行模式,但应该是无法实现楼主的目的的。我们看执行结果“

windeal@ubuntu:~/Windeal/shell$ sed 'N;s/\n//g' a.txt 123456789012345678901234567890

能够看出,sed 的N命令把第二行接到第一行后面,把第四行接到第三行后面,没有考虑到我们目标中:仅仅有非90结尾的才把下一行附加上来。所以第四行的123被附加到第三行1234567890而出现了错误的结果。

我觉得对的答案

再来看两个我觉得对的答案:
1.
sed -e '/^/{:loop /90$/!{N;b loop};s/\n//g}' test.txt > t2.txt
改一下好理解一点就是
sed '{:myloop /90$/!{N;b myloop};s/\n//g}' a.txt

/^/的意思我没弄明确。应该是匹配每一行吧
      在该命令中。myloop是一个自己定义的标签。

类似程序语言中goto用的标签。 N表示多行模式,b表示分支(相当于goto)

这样就好理解了。sed会读取一行内容,假设这一行不是以90结尾。/90$/! 就为真,进入
{N;b myloop}。

N就进入了多行模式。把下一行附加上来,然后进入分支b myloop,在推断是不是以90结尾,这样重复读取,直到读到以90结尾的行。

接下来模式空间的读取工作已经完毕。进入下一个命令。替换。s/\n//g​这个命令把当前模式空间的换行符都转换为空,也就是拼接成一行。

    如此,我们就完毕了我们要的目的。



2. 
awk '{if($0~/90$/){print}else{printf("%s",$0)}}' a.txt 

这个答案读取了一行的所以字段(实际上就1个字段,) 用$0表示,然后
if($0~/90$/)推断是不是以90结尾。
假设以90结尾,就输出当前行数据。
假设不是,就格式化输入当前航的字符串
注意print和printf的差别





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/117721.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • JAVA设计模式初探之装饰者模式

    这个模式花费了挺长时间,开始有点难理解,其实就是定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。…

    2022年3月11日
    38
  • PHP处理字符中的emoji表情

    PHP处理字符中的emoji表情

    2022年2月14日
    73
  • 校园网络拓扑图及配置_校园网防火墙

    校园网络拓扑图及配置_校园网防火墙该设计topo图(三层:核心、汇聚、接入),并加所有的配置命令。文章中的综合运用设计技术的单个技术如vlan划分、静态路由、OSPF、单臂路由(trunk/access)、DHCP、无线WLAN、Snooping、MSTP、VRRP、防火墙、DNSserver、ACL等。该topo适合了解并熟知单个组网技术的小伙伴,并想学习将单个技术组合应用的小伙伴,使用场景适用于毕业设计、校园网络规划、企业网络规划等场合………………………

    2022年9月27日
    4
  • 数据结构–(ElemType *&T)代表的意义「建议收藏」

    数据结构–(ElemType *&T)代表的意义「建议收藏」1、前言ElemType表示抽象数据类型。首先看个例子:函数1:voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;}函数2:voidswap2(int&x,int&y){inttemp;temp=x;x=y;…

    2022年5月19日
    56
  • C语言输出有颜色的字体

    C语言输出有颜色的字体先看下面的一段代码:#include<stdio.h>intmain(intargc,char**argv){printf(“\033[44;37;5mhelloworld\033[0m\n”);return0;}编译后运行上述代码,结果如下:可见,此时输出的字体和背景已经有了颜色。由上可知,在输出时候加上“\033[…

    2022年7月24日
    29
  • 运行疑难解答时出错0x8000FFFF_win10无法继续执行代码

    运行疑难解答时出错0x8000FFFF_win10无法继续执行代码使用的编译器为VS2017.在调试所选测试的时候,出现如题报错。解决办法:将对应测试项目中的Properties文件夹中的lunchSettings.json文件删除,再进行调试,即可运行。转载于:https://www.cnblogs.com/hooyeefam/p/10109234.html…

    2025年12月1日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号