1

この正確な問題に対する答えが見つからなかったので、質問します。

私は Cygwin で作業しており、!n表記法を使用して以前のコマンドを参照したいと考えています。たとえば、コマンド 5 がwhich lsの場合!5、同じコマンドを実行します。

問題は、置換を実行しようとするときです。したがって、次を実行します。

!5:s/which \([a-z]\)/\1/

ls を実行するか、コマンド番号 5 の引数が何であれ実行する必要があります。

この種の置換を行ういくつかの方法を試しましたが、同じエラーが発生します。

bash: :s/which \([a-z]*\)/\1/: substitution failed
4

2 に答える 2

3

私が知る限り、s/old/new/履歴置換構文は単純な文字列置換のみを行います。完全な正規表現はサポートしていません。これman bashが言わなければならないことです:

s/old/new/

イベント行で最初に出現する old を new に置き換えますの代わりに任意の区切り文字を使用できます/。イベント行の最後の文字である場合、最後の区切り文字はオプションです。区切り文字は、単一のバックスラッシュで古いもの新しいものを引用できます。new&に 表示され ている場合 は、 oldに置き換えられます。単一のバックスラッシュは、. oldが null の場合は、最後に置換されたoldに設定されます。以前の履歴の置換が行われていない場合は 、検索の最後の文字列に設定されます。&!?string[?]

しかし、恐れることはありません。実際、あなたがやろうとしていることを達成するためのより簡単な方法があります:

  1. !$前のコマンドの最後の引数に評価されます。

    # ls /etc/passwd
    /etc/passwd
    # vim !$
    vim /etc/passwd
    
  2. !5:$コマンド #5 の最後の引数に評価されます。

    # history
    ...
    5: which ls
    ...
    # !5:$
    ls
    
  3. Alt+.を使用して、 と同等の即時置換を実行することもできます!$Alt+.は、私が知っている最高の bash トリックの 1 つです。

于 2010-06-15T20:11:58.780 に答える
0

which lsこれは、Cygwin で Bash を使用して私にとってはうまくいきました (私のコマンドは私の履歴リストで 501 番だったことに注意してください。5あなたのものとは異なります):

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

このようにすることもできます(これはより短く/よりクリーンです):

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

于 2010-06-16T03:35:23.597 に答える