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