• 《sed的流艺术之二》-linux命令五分钟系列之二十二


    《sed的流艺术之二》-linux命令五分钟系列之二十二

    本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn。文章作者为rocrocket。

    为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅。

    ===

    [正文开始]

    上文接:《sed的流艺术之一》-linux命令五分钟系列之二十一

    5 sed中有选项么?有没有什么比较常用的?

    sed最主要的就是command部分,把这部分玩转了,你就已经很厉害了,而玩转这部分的前提是玩转正则表达式。尽管如此,sed的选项部分的-n选项仍然是非常重要,理解了它,对于你提高sed水平也是至关重要。

    前面提到,sed会将模式空间里的行经过处理后输出到标准输出,这是默认的处理方式。就是说,除非你使用d命令来删除此行,否则它无论变成什么样子,无论它被替换成什么形状,它都会多多少少被输出到屏幕上。前面的例子可以证明这一切。你不信?给你个最能说明问题的例子:

    [rocrocket@rocrocket programming]$ cat roc.txt
    1
    2
    3
    4
    5
    [rocrocket@rocrocket programming]$ sed ‘/4/p’ roc.txt
    1
    2
    3
    4
    4
    5

    看,除了所有的原始内容都被输出来了,而且含有字符4的行被重复输出了一遍。这就是sed的工作原理,它会不问青红皂白的先把原始行输出来,然后再执行后面的动作,在这里我们设定了p,表示打印此行。这种输出结果不是我们想要的,我们其实想要的是只输出含有4的行。

    这时,如果你使用了-n选项,你会发现,结果如你所愿了:

    [rocrocket@rocrocket programming]$ sed -n ‘/4/p’ roc.txt
    4

    选项-n告诉sed,除非是明确表明要输出的行,否则不要给我胡乱输出。(这回你知道-n的厉害了吧^_^)

    -n一般会和-p配合使用,意思是说输出那些发生变化的行。

    6 command部分感觉很复杂,能给稍微总结一下么?

    command部分是这样,可以分为两部分,一部分是确定范围部分,一部分是处理方式部分。

    确定范围部分可以分为两种方式:

    1 指定行数:例如3,5表示第3、第4和第5行;5,$表示第5行至最后一行;

    2 用模式匹配进行指定:例如/^[^dD]/表示匹配行首不是以d或D开头的行等等。

    处理方式部分呢,有很多命令可用,介绍几个最常用的吧:

    d:表示删除行

    p:打印该行

    r:读取指定文件的内容

    w:写入指定文件

    a:在下面插入新行新内容

    7 再举几个例子吧,给点经典的sed应用。

    例一 显示test文件的第10到20行:sed -n ‘10,20p’ test

    例二 将所有以d或D开头的行的所有小写x变为大写X:sed ‘/^[dD]/s/x/X/g’ test

    例三 删除每行最后的两个字符:sed ‘s/..$//’ test

    (有人会问用sed ‘/..$/d’ test为什么不行? 这是因为/..$/表示匹配所有末尾含有两个字符的行,然后删除这样的行,显然这是错误的)

    例四 删除每一行的前两个字符:sed ‘s/..//’ test

    未完待续:《sed的流艺术之三》-linux命令五分钟系列之二十三

  • 相关阅读:
    堆排序
    剑指 Offer 59
    面试题:happen-before原则和as-if-serial语义
    面试题:Redis的持久化机制是什么?各自的优缺点?
    面试题:单线程redis还这么快
    面试题:微服务理论
    wait和notify
    线程八锁
    面试题:在静态方法和非静态方法上加 Synchronized的区别
    面试题:3种线程阻塞唤醒的对比
  • 原文地址:https://www.cnblogs.com/qionghua520/p/4385854.html
Copyright © 2020-2023  润新知