あるファイルの1行を印刷して別のファイルの行を置き換えるための入力として使用したいと思います。
sed -n '12p' FILE1 | sed -i '12c\ STDIN' FILE2
可能ですか?
答え1
私はコマンドの標準入力読み取りをサポートするsedの実装を知りませんが、c
GNU sedではr
擬似ファイル名と一緒にコマンドを使用して元の行を/dev/stdin
削除d
できます。
... | sed -i '12{
r /dev/stdin
d
}' FILE2
または-e
チェーン式をより簡潔に使用してください。
... | sed -i -e '12{r /dev/stdin' -e 'd;}' FILE2
中かっこはコマンドをグループ化してr
、d
そのアドレスに対してすべて実行されるようにします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