1

我找不到这个确切问题的答案,所以我会问它。

我在 Cygwin 中工作,想使用!n符号引用以前的命令,例如,如果命令 5 是which ls,则!5运行相同的命令。

问题是尝试进行替换时,因此运行:

!5:s/which \([a-z]\)/\1/

应该只运行 ls,或者命令 5 的任何参数。

我尝试了几种进行这种替换的方法并得到相同的错误:

bash: :s/which \([a-z]*\)/\1/: substitution failed
4

2 回答 2

3

据我所知,s/old/new/历史替换语法只做简单的字符串替换;它不支持完整的正则表达式。这里man bash有话要说:

s/old/new/

用new替换事件行中第一次出现的old。可以使用任何分隔符来代替/. 如果最后一个分隔符是事件行的最后一个字符,则它是可选的。分隔符可以用单个反斜杠新旧形式引用。如果 出现在 new中,它会被old替换。一个反斜杠将引用. 如果old为 null,则将其设置为最后替换的old,或者,如果没有发生以前的历史替换, 则设置 为搜索中的最后一个字符串&&!?string[?]

不过,永远不要害怕。事实上,有更简单的方法可以完成您正在尝试做的事情:

  1. !$计算为上一个命令的最后一个参数:

    # ls /etc/passwd
    /etc/passwd
    # vim !$
    vim /etc/passwd
    
  2. !5:$计算为命令 #5 的最后一个参数:

    # history
    ...
    5: which ls
    ...
    # !5:$
    ls
    
  3. 您还可以使用Alt+.执行与 . 等效的立即替换!$Alt+.是我所知道的最好的 bash 技巧之一。

于 2010-06-15T20:11:58.780 回答
0

这对我在 Cygwin 中使用 Bash 有用(请注意,我的which ls命令在我的历史列表中是第 501 号;5不像你的):

$(!501 | sed 's/which \([a-z]\)/\1/')

你也可以这样做(更短/更干净):

$(!501 | sed 's/which //')

于 2010-06-16T03:35:23.597 回答