当替换文本位于文件中时,将一个文本块替换为另一文本块

当替换文本位于文件中时,将一个文本块替换为另一文本块

我有两个文件。第一个文件是现有的 C/C++ 源文件 ( *.cpp)。第二个是文本文件 ( *.txt),包含一个函数。该函数在两个文件中,需要将其从第二个文件 ( *.txt) 复制到第一个文件 ( *.cpp)。该函数也相当长(890 多行),因此复制/粘贴有点笨拙。

sed命令捕获第一个文件 ( ) 中的函数*.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 手册,但我运气不太好。首先要做的事情之一就是放弃/p.

我如何知道sed用另一个文件中的文本替换它找到的文本块?


我发现了类似的问题如何用另一个文件中的一段文本替换文件中两个标记之间的文本?但我不太明白发生了什么,特别是因为问题已被标记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"

如果要替换的字符串在一行上,您可以尝试此操作

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

相关内容