
質問
特定の文字列を含む行数を取得するために、次のコマンドを入力したとします。
me@machine $ command-producing-multi-line-output | grep -i "needle" | wc -l
今、どうすれば"needle"
この単語を別の単語にすばやく変更できますか?
現在の非効率的なソリューション
今私は:
Up
キーボードを押して最後のコマンドをロードします。- に達するまで
Left
またはCtrl
+を押します。Left
"needle"
- 単語を削除するには、
Backspace
またはCtrl
+を押します。w
- 新しい単語を入力するか貼り付けます。
- 勝つ
Enter
。
これは非常に非効率的なようです。
非効率的なソリューションの試み
たとえば、歴史的な近道を調べてみましたが、!!:sg/needle/new-needle
ここにはいくつかの問題があります。
- コマンドライン
Up
に戻るキーを押すことはできません。!!:sg/needle/new-needle
これにより、拡張内容が表示されます(元の質問に直接戻る)。 - 別の新しい針でこれを繰り返すには、交換
needle
とnew-needle
(つまり!!:sg/new-needle-from-before/yet-another-new-needle
)の両方が必要です。 - ピンの長さに関係なく時間/キー入力を節約するには、または同じものを使用するのではなく、内容全体を入力する必要があります
needle
。!:4
$4
!!:sg/!:4/new-needle
!!:sg/$4/new-needle
似たようなものを見つけました!:^-3 "new-needle" !:5-$
が、問題もありました。
- 履歴が拡張されるため、すばやく再利用できません。
- 拡張されていなくても、コマンドチェーンの途中で単語を置き換える必要がある元の問題はまだ残っています。
私は私がやりたいことを達成するための非常に迅速な方法があると信じており、いくつかのLinuxの専門家はそれを知っています。これについてのコメントや提案があれば、非常に感謝します。
編集する:
背景
いくつかの背景知識を提供するために、私はコマンドラインでOpenStackを使用して作業し、パイプラインコマンドの長いコマンドチェーンのさまざまな場所でパラメータを置き換える必要があることがよくあります。
OpenStack 環境の構成方法は、複数のエンジニアがstack
必要な数のサーバーでユーザーを共有し、複数の環境にわたって複数のクラスターがあることです。したがって、.bashrc
またはファイルで宣言された関数は.profile
実際には不可能です。
すばやく使用でき、設定がまったく必要ない、または最小限の設定しか必要としないポータブルデバイスが必要です。それ以外の場合は、完全にシェル外のソリューション(AutoHotKey / Keyboard Maestro / AutoKeyなどのクリップボードの交換)を使用する必要があります。
答え1
それは正確に何歴史的拡張使用:
$ command-producing-multi-line-output | grep -i "needle" | wc -l
...
$ ^needle^nipple
command-producing-multi-line-output | grep -i "nipple" | wc -l
...
答え2
同様の状況が発生し、有用なパターンである場合は、ここに解決策を示します。
データを変更し続け、インタラクティブな交換が面倒であることを認識して停止し、小さなループを作成しましたwhile
。
$ command-producing-multi-line-output | grep -i "needle" | wc -l
0
$ command-producing-multi-line-output | grep -i "haystack" | wc -l
0
$ while read needle; do
Up-Arrow前の行に移動して次の行にcommand-producing-multi-line-output
置き換えます。"haystack"
"$needle"
command-producing-multi-line-output | grep -i "$needle" | wc -l; done
something
0
something else
0
gold
1
Control(+で終わるD)
または少し華やかな変形:
$ while read needle; do
printf 'For: %s\n' "$needle"
command-producing-multi-line-output | grep -i "$needle" | wc -l; done
「今日」の後にこのコマンドラインの未来が見える場合は、それを関数またはスクリプトに書きます。
答え3
便利なエイリアスは次bash
のとおりです。
alias r='fc -s'
デフォルトでは、このr
コマンドは他のシェルでも頻繁に検出されます1歴史的に最新のコマンドを繰り返します。マニュアルbash
には定義に役立つ別名もあります。
[...] A useful alias to use with this is ``r="fc -s"'',
so that typing ``r cc'' runs the last command beginning with
``cc'' and typing ``r'' re-executes the last command.
また、最後のコマンドのテキスト内で置換を実行することもできます。
ここではコマンドを実行し、上記のエイリアスを使用して単語needle
ごとに置き換えますhaystack
。
$ command-producing-multi-line-output | grep -i "needle" | wc -l
bash: command-producing-multi-line-output: command not found
0
$ r needle=haystack
command-producing-multi-line-output | grep -i "haystack" | wc -l
bash: command-producing-multi-line-output: command not found
0
コマンドラインでこれを使用すると、r needle=haystack
シェルは実行するコマンドを印刷してすぐに実行します。ご覧のとおり、それも単語を置き換えます。
これらのエラーは明らかにcommand-producing-multi-line-output
コマンドの欠如によるものですが、この演習では問題ではありません。
コマンドはfc
履歴に保存されませんが、次のようにシェル関数で作成して保存できます。
fc() {
command fc "$@"
history -s fc "$@" # append the given fc command to history
}
それからあなたはできます
$ command-producing-multi-line-output | grep -i "needle" | wc -l
bash: command-producing-multi-line-output: command not found
0
次にcomm
始まる最新のコマンドを再実行してください。needle
r needle=haystack comm
$ r needle=haystack comm
command-producing-multi-line-output | grep -i "haystack" | wc -l
bash: command-producing-multi-line-output: command not found
0
最新のコマンドをもう一度実行して、haystack
次に置き換えますr haystack=beeswax
。
$ r haystack=beeswax
fc -s needle=beeswax comm
command-producing-multi-line-output | grep -i "beeswax" | wc -l
bash: command-producing-multi-line-output: command not found
0
fc
最後の行の二重呼び出しに注意してください。まずエイリアスを通してr
、次に関数を通して呼び出しますfc
。
明らかにfc
、コマンドを履歴に保存すると、誤って再帰呼び出しが発生する危険がありますfc -s
。
1組み込みコマンドで、OpenBSD では基本エイリアス、OpenBSD ではデフォルトエイリアスなどです。zsh
ksh
fc -s
ksh93
hist -s
答え4
要約:Ctrl++R nee
AltD haystack
Enter
リバースを開始するにはCtrl+を押します。R増分検索目的のコマンドラインの目的の部分が表示されるまで(以前のコマンドラインである必要はありません)、置き換えたいテキスト(または非常に似たテキスト)の数文字を入力します。前の項目を検索するにはCtrl+を押します。R遠すぎる場合はCtrl+を押してS前に移動します。Backspace間違った文字を入力した場合は、このキーを押してください。
目的の位置に達したら、+または+などのキーを使用してカーソルの周りのテキストの削除を開始したり、到達しDeleteた場所で単に増分検索を終了したりできます。AltDAltBackspaceEscape
Enterコマンドラインの編集が完了した後にのみこのキーを押します。増分検索中の一般的な意味は、Enter現在のコマンドラインをそのまま実行することです。単に検索モードを終了するわけではありません(Escape検索モードを終了するにはタップします)。