【问题标题】:Substitution from historical shell command从历史 shell 命令替换
【发布时间】:2010-11-18 12:02:42
【问题描述】:

我的历史中有这样的命令(Linux bash shell):

1119 for dir in `ls -d MyMod.*`; \
    do echo $dir;  \
svn copy --parents $dir $REPO/tags/MyMod_20101115/$dir -m"MyMod tag for 20101115"; \
done

其中 1119 是命令编号。

(请注意,该命令实际上都在一行中,并且不包含任何 \ 字符。我只是将它们放入此处以使其适合页面)

是否有一个单行可以用来将上面的从 20101115 修改为 20101118(代表今天日期的标签)。显然我们可以创建一个脚本来执行此操作。

这不是关于 SVN 的问题。上面的示例是一个 SVN 示例,但问题的目的是知道如何进行替换,特别是考虑到它在历史中并使用了 for。我们尝试将 echo !1119 与 sed 混合使用,但没有得到想要的结果。

【问题讨论】:

  • 我认为您正在寻找如何从 ~/.bash_history 中提取某些行?
  • 用替换修改历史行并执行。执行它可以用 xargs 来完成,虽然我需要去掉命令号。实际上,我正在尝试执行 ^$OLDDATE^$NEWDATE 但不是针对最近的命令。很惊讶这比我想象的要困难。

标签: bash shell


【解决方案1】:

!1119:gs/20101115/20101118

请参阅 bash 手册中的“历史扩展”

【讨论】:

  • 我在一个稍微不同的例子上进行了测试(只是列出了更改搜索路径的目录——因为我不想再创建新的 SVN 标签了),它运行良好!
【解决方案2】:

tail +1119 ~/.bash_history | head -1 | sed -e "s/20101115/20101118/g"

history | tail +1119 | head -1 | awk -F" " '{print $3 $4}' | sed -e "s/$OLD/$NEW/g"

【讨论】:

  • ~/.bash_history 在 bash 会话中不会更新。我建议history | awk 'NR=1119' | sed...
  • 这些不起作用:后一个只是输出所有历史和替换。即使我用 grep 减少它,我总是得到最新的命令,即我刚刚调用的命令,我仍然得到前缀 (1119) 所以不能 xargs 它。
【解决方案3】:
fc -s 20101115=20101118 1119

【讨论】:

  • 我已经测试了这个解决方案,它也可以工作。我不认为我可以有 2 个被接受的答案,但我给了你一个 +1。
猜你喜欢
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-29
相关资源
最近更新 更多