cygwin sed 替换历史命令
我找不到这个确切问题的答案,所以我会问它。
我正在 Cygwin 中工作,想要使用 !n
表示法引用以前的命令,例如,如果命令 5 是 which ls
,则 !5
运行相同的命令。
问题是当尝试进行替换时,因此 running:
!5:s/which \([a-z]\)/\1/
应该只运行 ls,或者无论命令号 5 的参数是什么。
我尝试了几种进行这种替换的方法,但得到了相同的错误:
bash: :s/which \([a-z]*\)/\1/: substitution failed
I couldn't find an answer for this exact problem, so I'll ask it.
I'm working in Cygwin and want to reference previous commands using !n
notation, e.g., if command 5 was which ls
, then !5
runs the same command.
The problem is when trying to do substitution, so running:
!5:s/which \([a-z]\)/\1/
should just run ls, or whatever the argument was for which for command number 5.
I've tried several ways of doing this kind of substitution and get the same error:
bash: :s/which \([a-z]*\)/\1/: substitution failed
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
据我所知, s/old/new/ 历史替换语法仅执行简单的字符串替换;它不支持完整的正则表达式。这是
man bash
所说的:不过,不要害怕。事实上,有更简单的方法来完成您想要做的事情:
!$
计算上一个命令的最后一个参数:<前><代码># ls /etc/passwd
/etc/密码
#vim!$
vim /etc/passwd
!5:$
计算为命令 #5 的最后一个参数:<前><代码># 历史记录
...
5:哪一个
...
#!5:$
LS
您还可以使用 Alt+。< /kbd> 执行相当于
!$
的立即替换。 Alt+。 是我所知道的最好的 bash 技巧之一。As far as I can tell the
s/old/new/
history substitution syntax only does simple string substitution; it does not support full regexes. Here's whatman bash
has to say:Never fear, though. There are in fact easier ways to accomplish what you are trying to do:
!$
evaluates to the last argument of the previous command:!5:$
evaluates to the last argument of command #5:You can also use Alt+. to perform an immediate substitution equivalent to
!$
. Alt+. is one of the best bash tricks I know.这对我在 Cygwin 中使用 Bash 有效(请注意,我的
which ls
命令在我的历史列表中是编号 501;而不是像您的那样的5
):$(!501 | sed 's/which \([az]\)/\1/')
您也可以这样做(更短/更干净):
$(!501 | sed 's/ //')
This worked for me using Bash in Cygwin (note that my
which ls
command was number 501 in my history list; not5
like yours):$(!501 | sed 's/which \([a-z]\)/\1/')
You could also do it this way (which is shorter/cleaner):
$(!501 | sed 's/which //')