bash - 如何从我的 bash 历史记录中删除与特定模式匹配的行?

标签 bash sed

我可以获得与特定模式匹配的行号列表,例如包含单词“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/

相关文章:

awk - 如何删除类中点之前的标签?

linux - 如何用字符串和随机生成的数字替换文件中的 header 值?

node.js - 如何在 bash 参数中保留引号?

linux - gzip: stdin: 不是 gzip 格式 tar: Child returned status 1 tar: Error is not recoverable: exiting now

bash - 如何获取某个字符后面的子字符串,如果该字符不存在则返回空

bash - 删除文件 A 中包含文件 B 中字符串的所有行

linux - sed 在 bash 脚本中不工作

linux - 使用 sed、awk 和 xargs 切片 3TB 日志文件?

regex - 在 bash 中批量文件重命名,删除带空格的名称,留下尾随数字

c - 我如何在 linux 中使用 objdump 和 bash 函数在共享对象文件中找到函数?