【问题标题】:How to use sed to delete next line on Solaris如何使用 sed 在 Solaris 上删除下一行
【发布时间】:2011-11-25 10:04:41
【问题描述】:

我尝试使用 sed 在文件中查找匹配模式然后删除 仅下一行。

例如

位置
纽约美国

位置
伦敦英国

我尝试了sed '/Location/{n; d}',它可以在 linux 上运行,但不能在 solaris 上运行。

谢谢。

【问题讨论】:

  • Solaris 中的结果是什么?

标签: sed solaris


【解决方案1】:

正如我在回答您的其他 sed 问题时提到的那样,Solaris sed 是老派,需要更多的手把手(或者换句话说),对它的语法更加挑剔。

你只需要一个额外的';'字符放在 `d' 字符之后,即

sed '/Location/{n; d;}'

更一般地,任何可以在 {...} 内的换行符上的内容在被卷起到一行时都需要一个分号分隔符。但是,您不能像在 Linux 中那样将“a”、“i”、“c”命令汇总到一行。

在 Solaris 标准 sed 中,'a'、i'、'c' 命令需要一个尾随 '\',后面不带空格或制表符,@987654327 上的数据(可能在 K 限制内)任意多@ 终止行(NO \r s),后跟一个空行。

较新的 Solaris 安装可能还安装了 /usr/xpg4/bin/sed。试试

/usr/xpg4/bin/sed '/Location/{n; d}' 

如果你幸运的话,它会支持你的快捷语法。我无法再访问任何 solaris 机器来测试这个。

最后,如果这不起作用,可以安装一些 GNU 工具包,它们的 sed 与您在 Linux 中使用的更相似。询问您的系统管理员 GNU 工具是否已经存在,或者是否可以安装。我不确定哪个版本的 gnu sed 开始支持“宽松”语法,所以不要假设它会在没有测试的情况下修复:-)

我希望这会有所帮助。

附: 欢迎来到 StackOverflow,让我提醒您我们通常在这里做的三件事:1)当您获得帮助时,也尝试给予帮助,回答您专业领域的问题 2)阅读常见问题解答,http://tinyurl.com/2vycnvr,3)当您看到好的问答,使用灰色三角形投票,http://i.imgur.com/kygEP.png,因为系统的可信度基于用户通过分享他们的知识而获得的声誉。还记得通过点击复选标记http://i.imgur.com/uqJeW.png

来接受更好地解决您的问题的答案(如果有)

【讨论】:

    【解决方案2】:

    您可以将下一行附加到当前行,然后删除所有不是Location

    $ cat text 
    Location
    New York <---- delete
    USA
    
    Location
    London <---- delete
    UK
    $ sed '/Location/{N;s/Location.*$/Location/;}' text
    Location
    USA
    
    Location
    UK
    

    我这里没有 Solaris,所以我想知道这是否可行。

    【讨论】:

      【解决方案3】:

      此 AWK 解决方案是否适合您 -

      [jaypal~/temp]$ cat a.txt 
      Location
      New York <---- delete 
      USA
      
      Location
      London <---- delete
      UK
      

      已更新以保留空行 -

      !NF 用于保留空白行。这意味着,如果字段数 = 0,则只需打印该行。 NF 是一个内置变量,用于跟踪记录中的字段数。如果我们遇到一个空行,我们跳过其余的处理并转到下一行。

      !/Location/ 将打印这些行。这是为了保留位置后面没有的行。只要模式为真,打印就是 AWK 中的隐式操作。

      第三个模式/动作是当它与 RegEx /Location/ 匹配时我们打印该行的位置。除了打印该行之外,我们还执行两次 getline ,这有效地删除了您的下一行,然后打印它。

      [jaypal~/temp]$ awk '!NF{print;next}; !/Location/; /Location/{print;getline;getline;print}' INPUT_FILE
      Location
      USA
      
      Location
      UK
      

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 2013-11-20
        • 2016-11-24
        • 1970-01-01
        相关资源
        最近更新 更多