ここでいくつかのUNIXシェルの基本が必要です:
に「-」ターゲットが表示されないコマンドの場合は、ed と言います。
print '%-2p\nq' | ed -s FILE
処理するデータとして、FILE 名ではなく、一部の cmd の stdout からストリームを提供できますか。
SomeCMD | ed -s SOMETHING_MAGICAL <<< 'print '%-2p\nq'
可能ですか?
edはstdinからコマンドを読み取るので、ファイルがstdinにもある場合、どのように機能しますか?
実際、出力を1行で連結すると、stdinを介してファイル入力をフィードできます。
i
最初に、データへの書き込みを開始してから、単一のを追加します。入力を終了し、その後に任意のコマンドを続けます。結果をstdoutに出力することもできます。ファイルに。が1つしかない行があると、壊れることを覚えておいてください。初期化。
したがって、ファイルinput.fileにこれが含まれている場合:
First line
Second line
Third line
そして、ファイルcommands.listにはこれが含まれています:
.
1d
1,$w /dev/stdout
次に、このコマンドライン...
echo i | cat - input.file commands.list | ed -s
これを出力します:
Second line
Third line
あえてtadaaaaaと言います!?
注:おそらく、単一の場合から保護することができます。そのような行をエスケープするフィルターを介してファイルをパイプ処理し、edコマンドを使用してそれらを再度エスケープ解除することにより、ファイル内の行。それはあなたの創意工夫に任せます。
別の注意:これには本当にsedを使用する必要がありますが、コメントを通過させることはできません。
r
コマンド出力をテキスト バッファに読み込むために使用します。だから、ポータブル:
printf '%s\n' 'r !df -h' g/tmpfs/d ,p q | ed -s
また
ed -s << IN
r !df -h
g/tmpfs/d
,p
q
IN
上記は の出力を読み取り、df -h
一致する行を削除しtmpfs
て結果を出力します。
シェルがプロセス置換をサポートしている場合:
printf '%s\n' g/tmpfs/d ,p q | ed -s <(df -h)
と呼ばれgnu ed
ます。
ページに従って:SOMETHING_MAGICAL
!
man
指定されている場合は、「ファイル」を読み取って編集を開始します。「ファイル」が「!」で始まる場合、シェル コマンドの出力を読み取ります。
printf '%s\n' g/tmpfs/d ,p q | ed -s '!df -h'
または、herestringを使用:
ed -s '!df -h' <<< $'g/tmpfs/d\n,p\nq\n'