cygwin对历史记录中的命令进行sed替换

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替换语法只进行简单的

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

我在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替换语法只进行简单的字符串替换;它不支持完整的正则表达式。下面是
manbash
要说的话:

s/旧/新/
将事件行中第一次出现的旧项替换为新项。任何分隔符都可以用来代替
/
。如果最后一个分隔符是事件行的最后一个字符,则它是可选的。分隔符可以用旧的和新的格式引用,并带有一个反斜杠。如果
&
出现在“新建”中,它将被“旧”替换。一个反斜杠将引用
&
。如果old为null,则将其设置为最后一个替换的old,或者,如果以前没有进行历史替换,则设置为
中的最后一个字符串!?字符串[?]
搜索

不过,不要害怕。事实上,有更简单的方法来完成你想要做的事情:

  • $计算为上一个命令的最后一个参数:

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

  • 您也可以使用Alt+。执行相当于
    的即时替换$。Alt+。这是我知道的最好的狂欢技巧之一


  • 这对我在Cygwin中使用Bash很有效(请注意,我的
    哪个ls
    命令是我历史记录列表中的501号;不像你的
    5
    ):

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

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

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

    # history
    ...
    5: which ls
    ...
    # !5:$
    ls