Riemann__ 2017-07-27 08:08 采纳率: 0%
浏览 718

谁能帮我分析一下下面加粗的命令?

#sed.txt文件内容
#cat sed.txt
a
b
aa
bb

#sed ‘/a/{h;d};/b/G’ sed.txt

  • 写回答

1条回答 默认 最新

  • 帝壹 2017-07-27 09:31
    关注

    三、最后一行line 5执行N没有内容可读,直接打印该行。

    h、H、g、G、x这几个命令都是用于模式空间和保持空间转换的。这里有必要解释一下模式空间和保持空间了:
    模式空间——容纳当前输入行的缓冲区。
    除了h/H/g/G/x,其他所有sed命令都是针对模式空间的内容进行处理的!
    保持空间——模式空间以外的一个预留缓冲区。
    只有h/H/g/G/x命令可以访问到保持空间的内容,并用于与模式空间内容的转换。

    h:将模式空间的内容复制到保持空间,类似与重定向符号>,会覆盖原由保持空间内容
    H:将模式空间的内容追加到保持空间,类似与追加重定向>>,追加到保持空间的尾行下
    g:类似h,将保持空间的内容复制到模式空间
    G:类似H,将保持空间的内容追加到模式空间
    x:交换模式空间与保持空间中的内容

    $ cat file
    1
    2
    11
    22
    $ sed ‘/1/{h;d};/2/G’ file
    2
    1
    22
    11
    这个sed命令完成了反转的功能,我们来看看是怎么实现的:
    一、/1/{h;d}命令搜索模式空间包含1的行然后先后执行h和d命令。结果首行1将被应用,h把该行(内容为1)复制到保持空间,此时模式空间和保持空间中的内容为:
    模式空间:1
    保持空间:1
    接着执行d,d不能访问保持空间,只处理模式空间的内容,将模式空间的内容删除,此时:
    模式空间: (空,没有内容)
    保持空间:1
    二、d命令执行完之后,执行/2/G,即在模式空间搜索包含2的行进行G处理,而此时模式空间无内容,所以不做任何操作。
    三、读取下一行文本到模式空间,继续执行’/1/{h;d};/2/G’。下一行文本的内容是2,此时:
    模式空间:2
    保持空间:1
    与步骤二的道理相同,h、d得不到执行(因为模式可空间没找到包含1的行);而’/2/G’将被执行,将保持空间的内容追加到模式空间后面,此时:
    模式空间:2
    1
    保持空间:1
    这一步完成以后,模式空间的内容将被sed默认地打印出来(如果有-n参数才不打印),于是前两行处理完之后,将输出:
    2
    1

    同理,后两行处理完之后,将输出:
    22
    11
    于是,我们看到了最后的结果:
    2
    1
    22
    11

    评论

报告相同问题?

悬赏问题

  • ¥15 vc6.0中想运行代码的时候总是提示无法打开文件是怎么回事
  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题