パイプを介してsedにどのように接続しますか?

パイプを介してsedにどのように接続しますか?

あるファイルの1行を印刷して別のファイルの行を置き換えるための入力として使用したいと思います。

sed -n '12p' FILE1 | sed -i '12c\ STDIN' FILE2

可能ですか?

答え1

私はコマンドの標準入力読み取りをサポートするsedの実装を知りませんが、cGNU sedではr擬似ファイル名と一緒にコマンドを使用して元の行を/dev/stdin削除dできます。

... | sed -i '12{
r /dev/stdin
d
}' FILE2

または-eチェーン式をより簡潔に使用してください。

... | sed -i -e '12{r /dev/stdin' -e 'd;}' FILE2

中かっこはコマンドをグループ化してrdそのアドレスに対してすべて実行されるようにします12。引数の一部として解析されるので、12{r /dev/stdin; d;}単に使用することはできません。; d;}r

答え2

GNUを使用sedして同時にバックアップファイルを作成します。

sed -i.bak "12c$(sed -n '12p' file1)" file2

またはポータブルオプション

sed -i.bak "12s/.*/$(sed -n '12p' file1)/" file2

答え3

いいえ、sedパイプラインデータは交換パターンではなく動作位置として解釈されます。ファイル名を指定すると、パイプは無視されます。コマンド置換を使用する必要があります。

sed "12c$(sed -n 12p FILE1)" FILE2

または名前付きパイプを迂回します。

mkfifo sedpipe
sed -n 12p FILE1 >sedpipe &
sed -i "12c$(cat sedpipe)" FILE2

関連情報