Bashコマンドの最初の単語をすばやく変更するにはどうすればよいですか?


44

Bashを使用してワークフローを少し改善したいのですが、別の実行可能ファイルに対して同じコマンドを実行したいことがよくあります。

いくつかの例:

Git(2番目の単語をすばやく変更したい場合):

git diff     foo/bar.c
git checkout foo/bar.c

Cat / rm(最初の単語のみを変更する必要がある場合):

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

私は私がヒットすることができます知っているCtrl+ aその後、Del最初の単語を削除するには、それを行うための迅速な方法がある場合、私は疑問に思って。



正直なところ、Ctrl + aを使用して削除するのが最も安全だと思います。それは間違いなく非常に遅くはありません。
agweber

回答:


56

!$ 前のコマンドの最後の単語に展開します。

だからあなたができる:

cat foo/is/a/very/long/path/to/bar.c

rm !$

または:

git diff foo/bar.c

git checkout !$

あなたの例はたまたま最後の言葉を繰り返すだけ!$なので、うまくいきました。実際に繰り返したい引数がたくさんあり、最初の単語を変更したいだけの!*場合、ゼロを除く前のコマンドのすべての単語に展開するを使用できます。

bashmanページの「HISTORY EXPANSION」セクションを参照してください。そこには多くの柔軟性があります。


16
正しい。警告だけをしたいと!$思います:あなたが走っている線を完全に視覚的に制御することはできません。これにより、有害な結果が生じる場合があります。ミスプリントが発生した場合は特に。history拡大するものからかかります。したがって、先頭に空白スペースを使用して最後のコマンドを記述した場合、おそらくこのコマンドは履歴で終了しません。!$シェルを使用して新しいコマンドを実行すると、最後に入力したコマンドラインからパラメーターが取得されず、履歴の最後からのみ取得されます。ここで同じ言葉。
ハスター

1
@Hastur事故を防ぐために、タブまたは入力時に履歴を展開するようにシェルを設定できます。
slhck

2
@Hasturだからこそ、zshでイントロを2回押す必要があります(恥知らずなプロモーション)
Braiam

@Hastur-何が起こるのか疑問がある場合、または入力したばかりの長いものを実行する前に他のことを最初に行う必要があることに遅刻した場合、行の先頭に移動して、#またはを追加しecho ますそれを見て、それが歴史に入っているので、私はそれをすぐに取り戻して、接頭辞を無効にすることなく再び実行することができます。
ジョー

28

Ctrl+でa行の先頭に移動し、Alt+でd最初の単語を削除します。


9
削除語のショートカットは実際にはMeta + dであり、Linuxマシンでは通常MetaはAltにマップされます。これが当てはまらないプラットフォームでは、Meta修飾子を取得する代わりに、Escapeをプレフィックスとして使用します。参照en.wikipedia.org/wiki/Meta_key
グスタボGiráldez

2
@GustavoGiráldezを深く掘り下げたいMeta+D場合emacsは、有効になっている場合(set -o emacsまたは、デフォルトで)のみ有効です。それはでは動作しません劣っエディタ -modeまたは場合はemacs無効になります。
TC1

多くの端末では(これは端末のものであり、Bashのものではないため)、ホームキーも行の先頭に移動します。多くのラップトップはFn + Leftをホームキーにマップします。同様に、通常、終了キーは行の最後に移動します。これらのホットキーをサポートしないターミナルエミュレータをまだ使用していません。
キャット

1
一方@マイク、C-aそしてM-dあなたの手でタイピングの位置に既にある場合ははるかに高速タイプです。
jjlin

@Mikeこれはバッシュです。catHome(^[[Hここ)を押したときとCtrl + a(^A)を押したときの結果を入力して比較します。
ジョナスシェーファー

17

実際に速くなるかどうかはわかりませんが、この記事、特にポイント#.3を参照してください。

  1. ^ str1 ^ str2 ^を使用して前のコマンドの文字列を置き換えます

次の例では、最初にlsコマンドを実行してファイルを検証します。後で、ファイルのコンテンツを表示したいことがわかりました。ファイル名全体を再度入力する代わりに、次のように前のコマンドの「ls」を「cat」に置き換えることができます。

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate

15

Alt+.

前のコマンドのいずれかの最後の部分だけを繰り返す必要がある場合は、履歴の最後の行から取得した最後の引数を貼り付けるAlt+ .を使用できます。

複数回押すと、直前の行の最後の引数で貼り付けたものが置き換えられます...

たとえば、最後の2つのコマンドが次の場合:

cat foo/is/a/very/long/path/to/bar.c
pico foo/is/a/very/long/path/to/SomeWhereElse.c

私が書いたシェルで+ rmを押すと表示されます:Alt.

rm foo/is/a/very/long/path/to/SomeWhereElse.c

私はもう一度押すとAlt+ .それが代わりに表示されます

rm foo/is/a/very/long/path/to/bar.c

等々...


理由はわかりませんが、これは私のMacコンソールでは動作しません。
ルラララ

ここで動作することが知られているキーボードショートカットがありbashます。ところで、bashをシェルとして使用ているのは確かですか?
ハスター

1
これはMacのものだと思います。入力すると
-lulalala


12

@jjlinの回答に加えて、次のヒントに興味があるかもしれません。

  • Ctrl+ w左側の単語を削除します
  • Ctrl+ kカーソルからコマンドラインの最後まで削除します
  • Ctrl+ uカーソルからコマンドラインの先頭までを削除します
  • Alt+ bカーソルを1単語後方に移動します
  • Alt+ fカーソルを1単語前に移動します
  • $_ 前のコマンドラインの最後の引数を含む

これらの詳細については、bashマンページの「Readlineコマンド名」セクションを参照してください。

例えば:

cat foo/is/a/very/long/path/to/bar.c
rm $_

これらは素晴らしいヒントですが、質問には答えません。
slhck

@slhck私見は、質問のタイトルが与えられた例と一致しないためです。例のように、私がやったように焦点を合わせると、タイトルは「bashコマンドで単語をすばやく変更する方法は?」。これが、私の答えが "@jjlinに加えて"である理由でもあります。しかし、私は質問を明確にする必要があると思います。
maiki

OP は、最初の例と2番目の例ではn、コマンドの最初の単語を常に削除(交換)したいと考えています。jjlinの答えは、最初の単語を削除する方法を示しています(ショートカットを再適用して、単語まで削除します)。あなたの答えにはいくつかのBashショートカットがリストされています(実際に便利です)が、最初の単語を削除する効率的な方法はありません。n = 1n = 2nn
slhck

もう一度読み$_ますが、引数が1つしかない場合(つまり、引数の総数n = m - 1がwhereの場合)にパラメーターはおそらく機能しますm。ただし、残りのショートカットは質問とは無関係です。
slhck

私は最初の例として読んで主張のために@slhck 「第二の単語を置き換える」 :-)
maiki

8

viに習熟している場合は、コマンドを使用してbash(ほとんどのシェル?)でviバインディングをアクティブにできますset -o vi。その後、通常のviキーを使用してコマンドを編集できます。最初の例では、^wcw「diff」を削除してから、チェックアウトに変更できます。

コマンドラインを編集するだけでviキーバインディングを学ぶ価値はないかもしれませんが、既に知っている場合は、生産性が格段に向上します。


私はkornshellで学びましたset -o vi。bashプロンプトでもこれを行います。
bgStack15

bindkey -vzshの場合。Esc 0 c w
user530873

6

この猫の皮を剥ぐ方法はたくさんあります!

特定の文字列を置換するには、^old^new^extraあなたの前のコマンドを取る置き換えられますoldnew、そして追加extra。できるだけ早く停止できます。たとえば、空の文字列に^old置き換えoldて、空の文字列を追加します(基本的に削除しold、それ以上何もしません)。

1. ^diff^checkout
2. ^cat^rm

これの特に有用なバリアント:

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

特定の単語を置き換えるには、コマンドを介し!m:n-pて単語を参照するために使用できます(現在のコマンドからカウントダウンするには負の数を使用します)。あなたは、省略することができ、単一の単語を参照する部分を、そして省略コマンド全体を参照するために、一部を。特殊な形態のため、前のコマンドの最後の言葉のため、および引数(すべてが、単語の前のコマンドのは)かなり便利です。npm-p:m-p!!!-1!$!*0

1. !!:0 checkout !!:2-
2. rm !*

私はこれらの両方をよく使用します。ここでは、zshが特に便利です。タブを押すと、不可解なものが展開され、正しく入力されたことを確認できます。

行編集を使用してこれを行うには、非常に多くの方法があります。シェルのキーバインドを読んでください。


-2

ほとんどの端末プログラムがサポートしています...

  • <Up-Arrow>必要に応じてを押して、履歴から以前のコマンドラインの1つを再表示します。
    • <Down-Arrow>必要に応じて押して、履歴リストを進めます。
  • <Left-Arrow>必要に応じて押して、カーソルを2番目の単語の末尾に移動します。
  • <Backspace>必要に応じて押して、2番目の単語を消去します。
  • 置換する2番目の単語を入力します。
    • 必要に応じて<Right-Arrow>/ <Left-Arrow>を押して、さらに変更するために再配置します。
  • ヒット<RETURN>してコマンドを実行する

必要なコマンドラインが最近のものではない場合、<Ctrl-r>問題の説明に従ってreverse-i-searchを実行します...
bashでコマンドの一部を入力した後にctrl-rを使用する方法はありますか?
次に、必要に応じて矢印キーを使用して編集します。


-3

私がしていること(Ubuntu / bash):

1)Arrow up前のコマンドを返すこと
2)Homeキーを最初に戻す
3)必要に応じてコマンドを変更する

白痴防止、特に複数行コマンドに役立ちます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.