zoukankan      html  css  js  c++  java
  • 《sed的流艺术之三》-linux命令五分钟系列之二十三

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

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

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

    ===

    [正文开始]

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

    例五 给某些字符串后面插入些内容

    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing
    London[rocrocket@rocrocket programming]$ sed ‘s/B.*/&2008/’ mysed.txt
    Beijing2008
    London

    这个命令的作用是将包含’B.*’的地方后面加上2008四个字符。这个命令里用到了&字符,这是一个技巧,高手和菜鸟比,这些技巧很重要哦。&表示“被匹配的部分”,在这里就是’Beijing’喽!

    例六 将行的第一个Beijing后加上2008,在最后一个Beijing后加上2008

    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing Beijing Beijing Beijing
    London London London London
    [rocrocket@rocrocket programming]$ sed ‘s/(Beijing)(.*)(Beijing)/12008232008/’ mysed.txt
    Beijing2008 Beijing Beijing Beijing2008
    London London London London

    这个命令稍显复杂,其中用到了一个技巧,就是预存储,即被(和)括起来的匹配内容会被按顺序存储起来,存储到1、2…里面。这样你就可以使 用加数字来调用这些内容了。这个例子就是使用了这个技巧,分别存储了三个内容,分别为匹配Beijing、匹配.*和匹配Beijing。

    你可能会问,我如果想在第一个t前加上M,在第二个t前加上N,怎么做呢?

    这个就需要使用正则表达式的非贪婪算法了,一般是在?、+、*、{n}、{m,}、{m,n}的后面紧跟一个?,就会使匹配从贪婪算法变成非贪婪算 法,但是遗憾的是,sed并不支持这种非贪婪算法,所以我们无法使用sed实现这种想法,只能另寻其他工具了。这也算是sed的一个遗留问题吧。

    例七 可以用模式来定位行范围

    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008
    Beijing 2007
    [rocrocket@rocrocket programming]$ sed -n ‘/2005/,/2007/p’ mysed.txt
    Beijing 2005
    Beijing 2006
    Beijing 2007

    我们使用/2005/来匹配行范围的首行,用/2008/来匹配行范围的最尾行。可以看到,在匹配尾行时,只要遇到符合要求的行,即停止,不会再继续向后匹配了。(只是匹配到第一个2007,并没有匹配到第二个2007)

    例八 用-e选项来设置多个command

    还记得command部分吧,现在我告诉你,sed命令可以包含不只一个的command,但是当包含超过一个的command的时候,必须在每个command前面加上选项-e。

    [rocrocket@rocrocket programming]$ sed -n -e ‘1,2p’ -e ‘4p’ mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2006
    虽然这个例子看似是为了使用-e而使用-e,但是-e在有些时候是很有用的。相信我,呵呵:)

    记住,-e后面必须立即接command,不允许再夹杂其他的选项了。

    例九 可以使用-f来设定包含command的文件名称

    如果你的command很长,那么可以将其写在文件里,然后使用-f来设定这个文件作为command部分:

    [rocrocket@rocrocket programming]$ cat callsed
    /2004/,/2006/p
    [rocrocket@rocrocket programming]$ sed -n -f callsed mysed.txt
    Beijing 2004
    Beijing 2005
    Beijing 2006
    两个命令就讲清楚了-f的用法。相信你能看懂。

  • 相关阅读:
    [C++] split string by string
    工作三个月心得经验
    Ubuntu Command-Line: Enable Unlimited Scrolling in the Terminal
    What is the PPA and How to do with it ?
    WCF vs ASMX WebService
    The ShortCuts in the ADT (to be continued)
    when does the View.ondraw method get called
    Browsing Storage Resources with Server Explorer
    Get start with Android development
    C++ Frequently asking question
  • 原文地址:https://www.cnblogs.com/qionghua520/p/4385867.html
Copyright © 2011-2022 走看看