web-dev-qa-db-ja.com

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

この質問 およびその回答は、既存のファイル( "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コードについては リンクされた回答 を見てください。

4
A.B

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
Wildcard

Sed付き(GNU sed)4.4

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