我想编写一个 sed (或 awk)命令来将一个文件中的字符串替换为另一个文件的全部内容,请检查

我想编写一个 sed (或 awk)命令来将一个文件中的字符串替换为另一个文件的全部内容,请检查
cat file.txt 
TEXT1 TEST2 TEST3
cat other_file.txt 
there are multiple lines1.
there are multiple lines2.
there are multiple lines3

我想要以下输出:

cat file3.txt 
there are TEXT1 TEST2 TEST3 lines1
there are TEXT1 TEST2 TEST3 lines2
there are TEXT1 TEST2 TEST3 lines3

multiple将关键字替换为每行文件中的所有内容希望这是清楚的

答案1

未经测试:

sed '1h;1d;G;s/multiple\(.*\)\n\(.*\)/\2\1/;P;d' file.txt other_file.txt > file3.txt

我需要解释吗?

答案2

使用GNU Awk 5.1.0,下面的代码将产生您所描述的内容。

cat file1
TEXT1 TEST2 TEST3

cat file2
there are multiple lines1.
there are multiple lines2.
there are multiple lines3.

awk 'NR==FNR{a=$0;next}{$3=a}1' file1 file2
there are TEXT1 TEST2 TEST3 lines1.
there are TEXT1 TEST2 TEST3 lines2.
there are TEXT1 TEST2 TEST3 lines3.

简短说明:
NR==FNR:awk 比较 NR(全局记录数)与 FNR(已处理文件的记录数)的快速方法。仅对于第一个文件,NR 等于 FNR。

a=$0$0保存整个记录/行,并将其存储在名为的变量中a

next:表示awk读取文件的下一条记录/行。

因此,这部分代码仅针对输入到 awk 的第一个文件执行,即 file1:
NR==FNR{a=$0;next}
PS:如果您的第一个文件有多于一行,则变量a将保存 file1 的最后一条记录/最后一行的内容。

这段代码在第二个文件(file2)上执行:
{$3=a}1

$3=a$3用变量 的内容替换(输入的第三个字段)a。如果该单词multiple并不总是位于 file2 输入行的第三个字段上,则显然此解决方案将失败。
或者,您可以使用类似的方法{sub("multiple",a)}1将单词字面替换multiple为变量的内容a

1: 只打印当前记录/行

相关内容