代替テキストがファイルにある場合は、あるテキストブロックを別のテキストブロックに置き換えます。

代替テキストがファイルにある場合は、あるテキストブロックを別のテキストブロックに置き換えます。

2つのファイルがあります。最初のファイルは既存のC / C ++ソースファイル(*.cpp)です。 2番目は*.txt関数を含むテキストファイル()です。関数は2つのファイルにあり、2番目のファイル(*.txt)から最初のファイル(*.cpp)にコピーする必要があります。関数の長さもかなり長く(890行以上)、コピー/貼り付けが少しぎこちないです。

sed注文があります最初の file() で関数をキャプチャします*.cpp

ifile=blake2.cpp.old
ofile=blake2.cpp
ffile=blake2-neon.txt
sed -n '/^static void BLAKE2_NEON_Compress64(/,/^}$/p' < $ifile > $ofile

sedキャプチャしたテキストを置き換える方法がわかりません。合格しようとしました。GNU sed マニュアルでも、運があまり良くないですね。最初にすべきことの1つはあきらめることです/p

sed見つかったテキストブロックを他のファイルのテキストに置き換える方法を教えてください。


同様の質問が見つかりましたファイルの2つのタグの間にあるテキストを別のファイルのテキストに置き換える方法は?しかし、私は何が起こっているのかよく理解していません。特に質問にタグが付けられていますが、sed回答が提供されたためですed


このスクリプトを作成する理由は、IA-32 SSEをARM NEONにポートするためです。基本的な置換を実行するスクリプトがあります。変更後は、更新された関数をソースコードにコピーし、そのコードをデバイスにscpしてからコンパイルする必要があります。泡立て、すすぎ、繰り返します。繰り返すたびに1000行の関数を手動でコピー/貼り付けると、他の操作を実行するのに時間がかかります。

答え1

これを試してみてください。関数の先頭を一致させ、readコマンドを使用してrテキストファイルを読み込みます。次に、d関数の開始と終了の間にあるすべての行を削除するコマンドを追加します。

sed '
/^static void BLAKE2_NEON_Compress64(/r '"$ffile"'
/^static void BLAKE2_NEON_Compress64(/,/^}$/d
' <"$ifile" >"$ofile"

置換したい文字列が1行にある場合は、これを試すことができます

uuid='c0e4e6b2-81f4-477c-89a4-7656e58719ce'
sed '/^'"$uuid"'/{
 r '"$ffile"'
 d
}' <"$ifile" >"$ofile"

関連情報