cygwin sed 替换历史命令

发布于 2024-09-05 09:46:21 字数 373 浏览 8 评论 0原文

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

我正在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

嘦怹 2024-09-12 09:46:22

据我所知, s/old/new/ 历史替换语法仅执行简单的字符串替换;它不支持完整的正则表达式。这是 man bash 所说的:

s/旧/新/

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

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

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

    <前><代码># ls /etc/passwd
    /etc/密码
    #vim!$
    vim /etc/passwd

  2. !5:$ 计算为命令 #5 的最后一个参数:

    <前><代码># 历史记录
    ...
    5:哪一个
    ...
    #!5:$
    LS

  3. 您还可以使用 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 what man bash has to say:

s/old/new/

Substitute new for the first occurrence of old in the event line. Any delimiter can be used in place of /. The final delimiter is optional if it is the last character of the event line. The delimiter may be quoted in old and new with a single backslash. If & appears in new, it is replaced by old. A single backslash will quote the &. If old is null, it is set to the last old substituted, or, if no previous history substitutions took place, the last string in a !?string[?] search.

Never fear, though. There are in fact easier ways to accomplish what you are trying to do:

  1. !$ evaluates to the last argument of the previous command:

    # ls /etc/passwd
    /etc/passwd
    # vim !$
    vim /etc/passwd
    
  2. !5:$ evaluates to the last argument of command #5:

    # history
    ...
    5: which ls
    ...
    # !5:$
    ls
    
  3. You can also use Alt+. to perform an immediate substitution equivalent to !$. Alt+. is one of the best bash tricks I know.

不念旧人 2024-09-12 09:46:22

这对我在 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; not 5 like yours):

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

You could also do it this way (which is shorter/cleaner):

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文