この問題これに対する答えは、既存のファイル(「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>
awk
PS:またはを使用する方が良いです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/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
ファイルの新しい内容を受け取ります。
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
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
答え3
sed(GNU sed) 4.4 使用
sed -i '/pattern/{h;s/.*/awk "NR>3" somefile/e;p;x}' receivingFile