この質問 およびその回答は、既存のファイル( "processedFile")のコンテンツをパターンの前に別の既存のファイル( "receiveingFile")に挿入できることを示していますs内部、次のように:
sed -i -e '/pattern/r processedFile' receivingFile
このようなコンテンツは、前のコマンドユニットの結果であり、まだ書き込まれていない場合があります。
その時点で、processedFileを作成/書き込みせずにコマンドユニットの結果をreceiveingFileに挿入することは可能ですか?
例:
たとえば、someFile
を次のように前処理しました(4行目からファイルの終わりまでの内容を読み取ります)。
awk 'NR>3' someFile
ここで、これを新しいファイルに書き込まずに、patternの前に次のようにreceiveingFileに直接挿入します。
awk 'NR>3' someFile | <insertion commands>
PS:できればawk
またはsed
を使用してください。
@RomanPerekhrestからのリクエストに基づいて、
someFile:
# random output
# random
11
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
前処理:
awk 'NR>3' someFile
:
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
receiveingFile:
stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.
実装によっては、すべての* NIXで移植可能かどうかはわかりません。それは私のLinuxDebianで動作しています。
TL; DR:/dev/stdin
をインクルードファイルとして使用します。これはsedの入力であり、パイプの前にコマンドの出力を取得します。
awk 'NR>3' someFile | sed -i -e '/pattern/r /dev/stdin' receivingFile
例:receivingFile
という宛先ファイルの内容:
stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.
someFile
という入力サンプル:
# random output
# random
11
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
パターンの後に挿入するには:
awk 'NR>3' someFile | sed -e '/pattern/r /dev/stdin' receivingFile
パターンの前に挿入するには、 OPによってリンクされた回答 を再利用し、出力にダンプします。
awk 'NR>3' someFile | sed -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile
求められたことを実行し、ファイルを置き換えるには:
awk 'NR>3' someFile | sed -i -n -e '/pattern/r /dev/stdin' -e 1x -e '2,${x;p}' -e '${x;p}' receivingFile
ReceiveFileの新しいコンテンツ:
stackExchange is the best.
0 0 0 23.259058 2.1756592 -1.2097659 -0.074128056 0.34343502 -0.017659865
0 0 0.05 51.091269 4.8520157 -0.0011590485 0.00096592555 0.0059719715 -0.050598505
pattern
Unix stackExchange is the best of the bests.
[〜#〜] update [〜#〜]:@ don_crisstiが指摘しているように、これはpatternの場合は機能しませんは最後の行です。 彼の答え から同じリンクされた質問に適合した別のコマンドがあります!余分な空白行の一時的な追加(およびsedによる抑制)に対応するには、他のコマンドが必要です。これらの2つは機能します:
awk 'NR>3' someFile | sed -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile <(printf '\n') > receivingFile.new
mv receivingFile.new receivingFile
または単に(bashを必要とせず、最終ファイルを処理するためにsed -i
を残す):
awk 'NR>3' someFile | { echo '' >> receivingFile; sed -i -e '/pattern/{r/dev/stdin' -e 'N;:l;$!n;$!bl};${/^$/!{s/\n$//};//d}' receivingFile ; }
行分割されたsedコードについては リンクされた回答 を見てください。
ex
のPOSIX指定のスクリプト可能な形式であるvi
を使用するだけです(これもPOSIX指定です)。
printf '%s\n' '/pattern/-r !awk "NR>3" somefile' x | ex receivingFile
またはより一般的に:
printf '%s\n' '/pattern/-r !somecommand' x | ex somefile
Sed付き(GNU sed)4.4
sed -i '/pattern/{h;s/.*/awk "NR>3" somefile/e;p;x}' receivingFile