次のパイプラインがあります。
➜ echo ,cats,and,dogs, | sed -e 's/,[^,]*,[^,]*,/,,,/'
,,,dogs,
!!
「最後のコマンドの実行」や「最後の引数の取得」などのコマンドを実行できることを知っていますが、「パイプで」を実行できる!:1
コマンドがあるかどうか疑問に思います。k
sed
したがって、この例では、いくつかの追加の出力をユーティリティにパイプするには、上記のパイプラインを実行した直後に次の操作を実行できます。
$ echo ,foo,bar,baz, | %:2
%:2
私が知らない仮想コマンドがあるかもしれませんか?k
「パイプラインで最初のコマンドを実行する」コマンドは存在しますか?
ベストアンサー1
歴史的拡大は、ターミナルが非常に遅くて制限的だった80年代(で紹介)にcsh
膨大でした。しかし、問題は、目に見えるものがすぐに得られないということです。遅すぎるまで(コマンドがすでに開始されている)拡張されたコンテンツは表示されません(一部のシェルではEnterキーを押す前に拡張を許可しますが)。
ここでは、カーソルに最後のパイプ要素を挿入するウィジェットを作成します。zsh
(に追加)~/.zshrc
:
last-pipe-elements() {
emulate -L zsh
if [[ $WIDGET = $LASTWIDGET ]]; then
# Invoking the widget several times retrieves pipeline
# elements for older command lines
((last_pipe_elements_iteration++))
LBUFFER=$last_pipe_elements_saved_LBUFFER
else
last_pipe_elements_iteration=1
fi
last_pipe_elements_saved_LBUFFER=$LBUFFER
local -a words
words=(${(z)${history[@]}[last_pipe_elements_iteration]})
local nth_pipe=${words[(In:NUMERIC:)\|]}
((nth_pipe)) || return
LBUFFER+=${(j: :)words[nth_pipe,-1]}
}
zle -N last-pipe-elements
bindkey '\eP' last-pipe-elements
この方法で入力しますAlt+Shift+P(ここでESCとP
文字シーケンスを送信すると仮定すると、端末に応じて調整する必要が\xd0
ある$'\MP'
かも\xf0
しれませんCtrl+V。文字を挿入します。最後のパイプ要素(含む|
)にコマンドを発行し、もう一度押すと、前のコマンドとAlt+2Alt+Shift+P最後の2つのパイプ要素に対して実行されます。
(z)
シェルパーサーを呼び出してコマンドラインを単語に分割します。必要なものを見つけ|
て、右側の単語を結合します。一つスペース。つまり、複雑な複数行構造を使用しない限り、(に変更しない|tr a b
限り)コマンドの意味には影響しません。| tr a b
sed 's/ /x/'
sed 's/ /x/'
新しいウィジェットを定義したくない場合は、後方に検索して(Ctrl+Rwhat-ifモードを使用してemacs
モードでも同じことができます)、行の最後まで削除してコマンドに戻ります。 () に貼り付けます。これは、履歴拡張を使用するよりも速く、まだ視覚的です(切り取りたい項目を視覚的に選択できます)。vi
|Ctrl+KDownCtrl+Y|