ZSH / BASH:从历史记录中删除特定行

ZSH / BASH:从历史记录中删除特定行

我的历史记录被某些包含拼写错误等的特定行“污染”了。例如:我经常需要 ssh 到某个服务器,如下所示:

ssh [email protected]
> Connects succesfully

但有时我也会犯错:

ssh [email protected]
> Permission denied

因为我依赖历史,所以这个拼写错误重复了多次:

cat .zsh_history | grep [email protected]
> : 1510301683:0;ssh [email protected]
> : 1511166682:0;ssh [email protected]
> : 1511193552:0;ssh [email protected]
> : 1512730972:0;ssh [email protected]
> : 1516368993:0;ssh [email protected]
> : 1516802690:0;ssh [email protected]
> : 1519633368:0;ssh [email protected]

有没有一种简单的方法可以纯粹通过 -command 的结果来清理我的历史记录grep?(或者也许还有其他更聪明的解决方案?)

更新:

请注意:我不是在寻找从历史记录中删除行的方法x;我知道有很多文章介绍这一点。我只是在寻找一种(简单?)方法来删除所有包含字符串的行y

答案1

此函数将从你的 Zsh 历史记录中删除你想要的任何一行,毫无疑问:

# Accepts one history line number as argument.
# Alternatively, you can do `dc -1` to remove the last line.
dc () {
  # Prevent the specified history line from being saved.
  local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"

  # Write out the history to file, excluding lines that match `$HISTORY_IGNORE`.
  fc -W

  # Dispose of the current history and read the new history from file.
  fc -p $HISTFILE $HISTSIZE $SAVEHIST

  # TA-DA!
  print "Deleted '$HISTORY_IGNORE' from history."
}

如果您想要另外阻止所有dc命令被写入历史记录,请在~/.zshrc文件中添加以下内容:

zshaddhistory() {
 [[ $1 != 'dc '* ]]
}

或者,为了获得更全面的解决方案,请尝试我的Zsh 编辑插件

答案2

您可以使用此命令正确删除历史记录中包含该字符串的所有行:

sed -i '/string/d' .bash_history

相关内容