我的历史记录被某些包含拼写错误等的特定行“污染”了。例如:我经常需要 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