替换文件中字符串的最后一次出现

use*_*594 2 shell search awk replace sed

这是我的文件的样子

Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1&
Run Code Online (Sandbox Code Playgroud)

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

Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1&
Gottagohome saab 90 75n > homelog 2>&1
Run Code Online (Sandbox Code Playgroud)

&应该被淘汰最后一个命令.知道如何做到这一点. 实际上我还需要在最后一次出现gottogohome命令之前插入等待.也有人可以说那个. TY Sam

anu*_*ava 7

你可以使用带有awk的tac:

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

  • 我很想知道为什么像你这样的 awk 大师会写那个。你为什么不写“tac file | awk 'NR==1{sub...}' | tac”?真正感兴趣,不挑剔:-) (2认同)
  • 如果我不得不使用`NR == 1`我可以使用`tail -1 file | sed或awk`我写的是灵活性,"要替换的注释"可能会也可能不存在于最后一行.输入文件中可能存在一些空行/注释行/其他命令.我的命令替换了给定命令的**最后一次**.希望你现在明白我的观点. (2认同)
  • 哦,好的,你很周到!我想我假设OP发布的示例是完整且完整的,最后一行是最后一个命令 - 但这可能不是最好的假设.谢谢你的解释. (2认同)
  • 不客气。可能是 OP 不需要这种灵活性,但我只是看了这个要求“我想要的是寻找最后一个命令并使其在前台运行”,因此以这种方式实现。 (2认同)
  • Anubhava - 支持你的名字。你有洞察力要求的“经验”——这正是我的情况——在最后一个命令背后还有很多其他的用具。 (2认同)

pot*_*ong 6

这可能适合你(GNU sed):

sed '$s/.$//' file
Run Code Online (Sandbox Code Playgroud)

编辑:

为了迎合最后的命令:

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