shell Bash:选择与模式匹配的上一个命令

ohfgkhjo  于 2022-11-16  发布在  Shell
关注(0)|答案(4)|浏览(147)

我知道使用向上和向下箭头的bash历史导航。
我想用一种懒惰的方式来选择与某个正则表达式匹配的前一个命令(比整个命令短,所以键入时间更短)。
有可能用bash吗?
如果没有,其他贝壳是否有这样的特点?

von4xj4u

von4xj4u1#

您可以使用CTRL-R来向后搜索历史记录,并键入前一个命令的某些部分。再次命中CTRL-R(在第一次命中之后)会重复您的查询(如果有,则跳到下一个匹配项)。
就我个人而言,我使用这个正则表达式搜索(因为正则表达式搜索是不可能的(AFAIK)):

# search (using perl regexp syntax) your entire history
function histgrep()
{
     grep -P $@ ~/.bash_history
}

**编辑:**有关通过该函数搜索最近的历史记录项目,请参见this(关于设置$PROMPT_COMMAND)。

ffdz8vbo

ffdz8vbo2#

Zsolt,避免使用硬编码的文件名,使用HISTFILE变量,如果你真的很偏执,还有一个备用方法:${历史文件:-~/.bash_历史} ;- )
为什么要直接在历史文件中执行grep?!这样会丢失历史记录编号,而历史记录编号是复制命令所必需的(例如!33用于再次执行历史记录中的第33个条目),而不必复制粘贴grep的输出。
请记住,使用这种$@扩展可能会在不同的(史诗级)级别。例如,以“-”开头的参数(histgrep -h)通常会挂起,或者搬起石头砸自己的脚。实际上,这个基本的例子可以很容易地解决,遵循经典的“--”方式将argumentsoptions分开,但是讨论没有结束,记住提供给黑客的参数是正则表达式。- )
哦,难道histgrep不是一个太冗长的选择吗?h,i,Tab,g,Tab:)
恕我直言,我会坚持使用^R,回到历史上来|grep......无论如何,为了这个例子,我(懒洋洋地)将这个小助手重写为:

function hgrep() { history | grep -P -- "$*"; }
wsewodh2

wsewodh23#

在此查看我的答案
示例:

$echo happy
happy
$!?pp?
happy
3lxsmp7m

3lxsmp7m4#

我更喜欢这个解决方案,因为除了通过regex搜索之外,可以看到整个历史的所有内容,regex-type是根据vim的非常好的regex引擎:

vim -u /root/.vimrc -M + <( history )

这我已经在这我的职位:
https://unix.stackexchange.com/questions/718828/search-in-whole-bash-history-list-with-full-featured-regex-engine
此致
安东·韦塞尔

相关问题