ファイルのパターンの直前にコマンド出力を挿入するにはどうすればよいですか?

ファイルのパターンの直前にコマンド出力を挿入するにはどうすればよいですか?

この問題これに対する答えは、既存のファイル(「processedFile」)の内容を他の既存のファイル(「refacingFile」)の1つの前に挿入できることを示しています。模様■内部には次のようになります。

sed -i -e '/pattern/r processedFile' receivingFile

時々、このコンテンツのソースは次のとおりです。前の命令ユニット、まだ書かれていません。

このとき、processoredFileに生成/書き込みを行わずに、command単位の結果をreceiveFileに挿入することは可能ですか?

例:

たとえば、次のように前処理しますsomeFile(ライン4からファイルの終わりまでコンテンツを読み取る)。

awk 'NR>3' someFile

これで、新しいファイルに書き込むのではなく、receiveFileに直接挿入しようとしています。模様だから:

awk 'NR>3' someFile | <insertion commands>

awkPS:またはを使用する方が良いですsed


@RomanPerekhrestのリクエストに応じて、

ファイル:

# 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

ファイルを取得:

stackExchange is the best.
pattern
Unix stackExchange is the best of the bests.

答え1

すべての* NIXで移植可能かどうかは、実装によって異なります。私のLinux Debianで動作します。

TL;DR: /dev/stdinsed への入力であるインクルード・ファイルとして使用され、パイピングの前にコマンドの出力を取得します。

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

ファイルの新しい内容を受け取ります。

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.

修正する:@don_crisstiが指摘したように、模様最後の行です。次は彼の答え同じリンクの問題について!追加の空行の一時的な追加(および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コード。

答え2

exPOSIXで指定されたスクリプト可能な形式vi(これもPOSIXで指定)を使用してください。

printf '%s\n' '/pattern/-r !awk "NR>3" somefile' x | ex receivingFile

またはより一般的に:

printf '%s\n' '/pattern/-r !somecommand' x | ex somefile

答え3

sed(GNU sed) 4.4 使用

sed -i '/pattern/{h;s/.*/awk "NR>3" somefile/e;p;x}' receivingFile

関連情報