我可以获得与特定模式匹配的行号列表,例如包含单词“function”。
history | grep function | sed -e 's/^\(.\{5\}\).*/\1/' | sed 's/^ *//g'
如果我对它执行 history -d
它说模式不好,我不知道它是列表还是它们的字符串而不是数字?
history -d (history | grep function | sed -e 's/^\(.\{5\}\).*/\1/' | sed 's/^ *//g')
最佳答案
快速回答:
while read n; do history -d $n; done < <(history | tac | awk '/function/{print $1}')
解释:
history
命令在使用 -d
标志时只接受一个偏移量。最重要的是,当您删除一个条目时,它还会重新编号该条目之后的所有命令。出于这个原因,我们使用 tac
恢复 history
的输出,并从最后到第一处理行。这个简短的 awk
行只是替换了 grep 和 sed 命令来获取历史偏移量。
我们不使用完整的管道,因为这会创建子外壳,history -d $n
将无法正常工作。这在以下内容中得到了很好的解释:Why can't I delete multiple entries from bash history with this loop
注意:如果你想把这个推送到你的历史文件($HISTFILE
),你必须使用history -w
警告:当您的历史记录中有多行命令时,故事会变得非常复杂,并且在很大程度上取决于已设置的各种选项。参见 [U&L] When is a multiline history entry (aka lithist) in bash possible?对于讨厌的部分。
关于bash - 如何从我的 bash 历史记录中删除与特定模式匹配的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62793906/