【问题标题】:replace the last occurance of a string in a file替换文件中最后一次出现的字符串
【发布时间】:2014-01-31 07:31:42
【问题描述】:

这是我的文件的样子

Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1&

这些命令是动态生成的。我想要的是寻找最后一个命令并让它像这样在前台运行

Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1

& 应该取消最后一个命令。 知道这是如何完成的。 实际上,我还需要在 gottogohome 命令的最后一次出现之前插入一个等待。也可以有人请那个。 泰 山姆

【问题讨论】:

  • 这真的是你想做的吗?因为它不会让你的脚本等到所有进程完成。也许您实际上的意思是将最后一个留在后台,但在最后一行添加“等待”以等待所有进程完成......

标签: regex shell search awk sed


【解决方案1】:

您可以将 tac 与 awk 一起使用:

tac file | awk '!done && /Gottagohome saab 90 75n/{done=1; sub(/&$/, "")}1' | tac

【讨论】:

  • 我很想知道为什么像你这样优秀的 awk 大师会写这个。为什么不写“tac 文件 | awk 'NR==1{sub...}' | tac”?真正感兴趣,而不是批评:-)
  • 如果我必须使用NR==1,我本来可以使用tail -1 file | sed or awk,我写的很灵活,comment to be replaced 可能出现在最后一行,也可能不出现。输入文件中可能存在一些空白行/注释行/一些其他命令。我的命令替换了给定命令的 最后一次出现。希望你现在明白我的观点。
  • 哦,好吧,你很周到!我想我假设 OP 发布的示例是完整的并且最后一行是最后一个命令 - 但这可能不是最好的假设。感谢您的解释。
  • 不客气。可能是 OP 不需要这种灵活性,但我只是查看了这个要求What I want is to look for the last Command and make it run in the foreground,所以以这种方式实现了它。
  • Anubhava - 以你的名字站立。你有洞察需求的“经验”——这正是我的情况——最后一个命令背后还有很多其他用具。
【解决方案2】:

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

sed '$s/.$//' file

编辑:

为了满足最后一条命令

sed -r '/(Gottagohome saab 90 75n.*)&\s*$/M,$!b;//{x;//p;x;h};//!H;$!d;x;s//\1/' file

【讨论】:

  • sed --posix '$s/\$[[:blank:]]*$//' YourFile 可能有点安全
【解决方案3】:
$ awk -v RS= '{sub(/&$/,"")}1' file
Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1

【讨论】:

    【解决方案4】:
    awk 'NR==FNR{if(/^Gotta/) a=NR;next} {if (FNR==a) sub(/&$/,"")}1' file file
    

    【讨论】:

      【解决方案5】:

      仅删除最后一个 &awk

      awk '{a[NR]=$0} END {for (i=1;i<NR;i++) print;NF-=1;print}' OFS="" FS="" file
      Gottagohome saab 90 75n > homelog 2>&1&
      Gottagohome saab 90 75n > homelog 2>&1&
      Gottagohome saab 90 75n > homelog 2>&1
      

      另一个版本

      awk 'NR>1 {print f}{f=$0} END {print substr($0,1,length($0)-1)}' file
      

      【讨论】:

        猜你喜欢
        • 2011-04-19
        • 2011-07-26
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        • 2016-02-14
        • 2013-05-15
        相关资源
        最近更新 更多