コマンドのパイピング、stdinからstdoutへの書き込みの変更


8
echo Hello World | nano - | less

テキストエディタでHello-> Goodbyeを変更したい。

nanoである必要はありません。私はナノ読み取り標準入力で立ち往生していますが、ファイルへの書き込みを要求しています(書き込み-という名前のファイルを作成します-)



@slm、これはより広いケースなので、他のQをこれのまとまりとして閉じる方が理にかなっていると思います。
Graeme

@Graeme-私はあなたとwに同意する傾向がありますが、他の人もあなたの答えを持っていますが、うまく書かれていません。一部のマージはより適切な場合があります。たぶん、これら2つを支援するためにmodの助けを借りるべきでしょうか?それについて1つpingします。
slm

@slm、クローズキューを通過する人に任せて、群衆に決定を任せることができると思います。私が目にする主な違いは、他のQは、パイプの一端のみが必要なこの特殊なケースであることです。
Graeme 14

1
@Graeme-ポンプをプライミングしない場合、pplは新しいものを古いものに、dupとして閉じる可能性があります。
slm

回答:


11

moreutilsのパッケージと呼ばれる、これを行うための偉大なコマンドがありますvipe。manページから:

SYNOPSIS
       command1 | vipe | command2

DESCRIPTION
       vipe allows you to run your editor in the middle of a unix pipeline and
       edit the data that is being piped between programs. Your editor will have
       the full data being piped from command1 loaded into it, and when you close
       it, that data will be piped into command2.

デフォルトeditorでは、これはコマンドを使用します。これは通常、デフォルトのコマンドラインエディターへのシンボリックリンクです。これを変更するには、リンクを変更するか(update-alternativesDebianベースのシステムで使用)、EDITOR環境変数を使用します。たとえば、次のことができます。

echo Hello World | EDITOR=nano vipe | less

それ以外の場合、特定のテキストエディターがこの種のことをサポートしていない場合、手動で一時ファイルを作成し、そこにファイルを書き込み、エディターを実行し、残りのパイプラインにファイルを入力し、一時ファイルを削除します。vipeコマンドは基本的にこのすべての世話をします。これは便利ですが、コマンドがデフォルトで使用できることはほとんどありません。


1

テキストエディターjoe(別名Joe's Own Editor)は、必要なことを行います。

コマンドecho "hello world" | joe - | lessは予想どおりに機能しますが、何らかの理由で引用符が必要です。

一部のコマンド(gpgなど)は、パイプに入らない出力を表示します。これはjoe内の最初の表示を壊しますが、ctrl + r-リフレッシュ- を押すとクリーンアップされます。


1

"Hello"を "Goodbye"(または他の単語の置き換え)に置き換えるだけの場合は、自動検索&置換ツールを使用して、エディターでの手動編集を回避できます。たとえば、「sed」は次のような置換を行うことができます。

echo Hello World | sed 's/Hello/Goodbye/' | less

詳細については、「man sed」を確認してください。

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