パイプラインでkthコマンドをどのように再実行しますか?

パイプラインでkthコマンドをどのように再実行しますか?

次のパイプラインがあります。

➜  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 bsed 's/ /x/'sed 's/ /x/'

新しいウィジェットを定義したくない場合は、後方に検索して(Ctrl+Rwhat-ifモードを使用してemacsモードでも同じことができます)、行の最後まで削除してコマンドに戻ります。 () に貼り付けます。これは、履歴拡張を使用するよりも速く、まだ視覚的です(切り取りたい項目を視覚的に選択できます)。vi|Ctrl+KDownCtrl+Y|

おすすめ記事