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"