【问题标题】:find and replace when pattern include \n - linux command line当模式包含 \n - linux命令行时查找和替换
【发布时间】:2013-07-21 05:31:17
【问题描述】:

我有一个文件,我想替换以行尾 \n 结尾的模式...我已经在网上搜索了一种方法来执行此操作,但它们都不起作用...我m 能够将行尾替换为其他内容,但不能替换包含行尾的模式..

这是一个例子 文本文件有这样的:

22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,

最后一行缺少一个值(它可以在任何其他行),我想找到 \n 并替换为 -999

所以文字变成了这样:

22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999

有什么想法吗????

【问题讨论】:

    标签: linux text replace sed awk


    【解决方案1】:

    你可以说:

    sed 's/,[^0-9]*$/,-999/' filename
    

    【讨论】:

    • 我认为它有效,但我在每一行都得到了一个额外的 ,-999,在最后一行我得到了 ,,-999 =( 我也尝试了 awk 的建议,但没有成功跨度>
    • 哦,是的,我相信您尝试过sed 's/[^0-9]*$/,-999/' filename。这与上面的编辑不同(注意附加的逗号)。
    【解决方案2】:

    awk:

    awk 'BEGIN{FS=OFS=","}{if($11==""){$11="-999"};print}' your.file
    

    如果第11列为空,该命令会将第11列设置为-999


    用户sudo_O 建议使用上述脚本的一个版本,该版本遵循相同的逻辑但看起来更简洁:

    awk '$11==""{$11=-999}1' FS=, OFS=, your.file 
    

    【讨论】:

    • 什么不起作用?我已经用您在问题中发布的文件对其进行了测试
    • @shodanex :) 我认为这很有趣,您似乎采取了与我一样的解决方案.. (并且遇到了与该换行符相同的问题).. 最后上面的行做了对我来说的诀窍:)
    • @sudo_O nice :) 为什么不回答?它看起来比我的干净得多
    • @sudo_O 你的命令是我如此喜欢 awk 的原因之一!到目前为止,我已经获得了理解它的专业知识,但是你看,我自己的命令在大多数情况下仍然可以简化......将继续学习。谢谢你教这个! :)
    • 这个问题还有 5 个其他答案,我的答案只会在风格上与你的不同,所以没有多大意义。这就是为什么我也喜欢awk,如果您愿意,请随时将我的代码作为您的答案。
    【解决方案3】:

    这个 sed 应该可以工作:

    sed -i.bak 's/, *$/&999/' file
    

    【讨论】:

      【解决方案4】:

      也许用,-999\n替换,\n

      sed 's/\,\n&/\,-999\n&/g' file_name
      

      【讨论】:

      • 谢谢你们(@anubhava),但提议的解决方案都没有改变任何东西=/
      【解决方案5】:

      也许您可以使用 awk 分隔符变量,如下所示:

      #!/usr/bin/awk -f
      BEGIN {
          FS=",";
          OFS=",";
      }
      {
          if ( $11 == "") {
              print $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,"-999"
          } else {
              print $0
          }
      }
      

      【讨论】:

        【解决方案6】:
        $ awk '{print $0 (/,$/?-999:"")}' file
        22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
        20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
        19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
        19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999
        

        或者如果你喜欢高尔夫:

        $ awk '/,$/{$0=$0"-999"}1' file
        22.0,26235,-48.4,-999,-999,-999,100,22,669.0,-999,669.0
        20.0,26860,-47.5,-999,-999,-999,100,21,690.0,-999,690.0
        19.3,27096,-47.1,-999,-999,-999,100,21,698.3,-999,698.3
        19.0,-999,-999,-999,-999,-999,100,21,-999,-999,-999
        

        就我个人而言,我会为此使用已发布的简单 sed 解决方案之一,例如@anubhava 的

        【讨论】:

          【解决方案7】:

          这可能对你有用(GNU sed):

          sed -r 's/[^,]+/&/11;t;s/$/-999/' file
          

          如果没有第十一个字段追加-999

          【讨论】:

            猜你喜欢
            • 2022-01-09
            • 2017-03-21
            • 2012-12-29
            • 2013-02-09
            • 1970-01-01
            • 2014-09-23
            • 2018-12-27
            • 2013-12-27
            • 2014-09-19
            相关资源
            最近更新 更多