如何替换每个第二行

如何替换每个第二行

如何用另一个文本文件的行列表替换文本文件的每个第二行。
示例:
cat filea.txt
我爱粉红色
我爱蓝色
我爱狗
我爱 MOMO

cat bileb.txt
我讨厌黄色
我讨厌白色
我讨厌老鼠
我讨厌猪

现在我需要输出
I love Pink
我讨厌黄色
我爱狗
我讨厌老鼠

textbile b 应该替换文本 filea 的每个第二行而不附加它。我们如何使用 sed 或 awk 中的 -i 来实现这一点。
我尝试使用 paste 命令来做到这一点,它不会替换它附加。

答案1

使用 GNU sed,您可以使用以下R命令:

   R filename
          Append  a line read from filename.  Each invocation of the command 
          reads a line from the file.  This is a GNU extension.

所以

$ sed 'R fileb.txt' filea.txt
I love Pink
I hate yello
I love Blue
I hate white
I love Dogs
I hate rats
I love MOMO
I hate pigs

结合d删除原行:

$ sed -e '2~2{R fileb.txt' -e 'd;}' filea.txt
I love Pink
I hate yello
I love Dogs
I hate white

如果要将 filea.txt 的每隔一行替换为 fileb.txt 的每隔一行,那么:

$ sed '2~2d' fileb.txt | sed -e '2~2{R /dev/stdin' -e 'd;}' filea.txt
I love Pink
I hate yello
I love Dogs
I hate rats

或者,使用paste将文件的行并排连接起来,然后通过管道将sed奇数行的默认制表符分隔符更改为换行符:

$ paste filea.txt fileb.txt | sed -n '1~2s/\t/\n/p'
I love Pink
I hate yello
I love Dogs
I hate rats

显然,如果原始 filea.txt 可能包含制表符,则此方法不起作用。

由于您也标记了您的问题awk,因此您也可以考虑类似

awk '{getline x < "fileb.txt"} NR%2 {print; print x}' filea.txt

相关内容