我找不到这个确切问题的答案,所以我会问它。
我在 Cygwin 中工作,想使用!n
符号引用以前的命令,例如,如果命令 5 是which ls
,则!5
运行相同的命令。
问题是尝试进行替换时,因此运行:
!5:s/which \([a-z]\)/\1/
应该只运行 ls,或者命令 5 的任何参数。
我尝试了几种进行这种替换的方法并得到相同的错误:
bash: :s/which \([a-z]*\)/\1/: substitution failed
我找不到这个确切问题的答案,所以我会问它。
我在 Cygwin 中工作,想使用!n
符号引用以前的命令,例如,如果命令 5 是which ls
,则!5
运行相同的命令。
问题是尝试进行替换时,因此运行:
!5:s/which \([a-z]\)/\1/
应该只运行 ls,或者命令 5 的任何参数。
我尝试了几种进行这种替换的方法并得到相同的错误:
bash: :s/which \([a-z]*\)/\1/: substitution failed
据我所知,s/old/new/
历史替换语法只做简单的字符串替换;它不支持完整的正则表达式。这里man bash
有话要说:
s/old/new/
用new替换事件行中第一次出现的old。可以使用任何分隔符来代替
/
. 如果最后一个分隔符是事件行的最后一个字符,则它是可选的。分隔符可以用单个反斜杠以新旧形式引用。如果 出现在 new中,它会被old替换。一个反斜杠将引用. 如果old为 null,则将其设置为最后替换的old,或者,如果没有发生以前的历史替换, 则设置 为搜索中的最后一个字符串。&
&
!?string[?]
不过,永远不要害怕。事实上,有更简单的方法可以完成您正在尝试做的事情:
!$
计算为上一个命令的最后一个参数:
# ls /etc/passwd
/etc/passwd
# vim !$
vim /etc/passwd
!5:$
计算为命令 #5 的最后一个参数:
# history
...
5: which ls
...
# !5:$
ls
您还可以使用Alt+.执行与 . 等效的立即替换!$
。Alt+.是我所知道的最好的 bash 技巧之一。
这对我在 Cygwin 中使用 Bash 有用(请注意,我的which ls
命令在我的历史列表中是第 501 号;5
不像你的):
$(!501 | sed 's/which \([a-z]\)/\1/')
你也可以这样做(更短/更干净):
$(!501 | sed 's/which //')