替换另一个文件中特定位置的文本

替换另一个文件中特定位置的文本

我需要替换文本文件2.txt文件1.txt介于第 5 名和第 8 名之间。它应该是第 5 到第 8 个位置之间的任何字符,我只需要用提到的位置中的新字符替换,剩余位置的字符应该与原样相同。

文件1.txt:

abcd9876efghijklmno
abcd9676efghijklmno
abcd9886efghijklmno
abcd9976efghijklmno

文件2.txt:

1234
4321
6543
5678

预期输出:

abcd1234efghijklmno
abcd4321efghijklmno
abcd6543efghijklmno
abcd5678efghijklmno

我尝试过的命令

sed '/substr($0,5,4)/r File2.txt' File1.txt >file_new.txt

答案1

可能更容易使用组合paste+cut

$ paste -d'\0' <(cut -c1-4 File1.txt) File2.txt <(cut -c9- File1.txt)
abcd1234efghijklmno
abcd4321efghijklmno
abcd6543efghijklmno
abcd5678efghijklmno
  • -d'\0'以便组合输入时之间没有任何字符
  • <()流程替代
  • cut -c1-4给出每行的前四个字符
  • cut -c9-给出从第 9 个位置开始的每行的所有字符


另一种方法是惯用的两个文件处理使用awk

$ awk 'NR==FNR{a[FNR]=$0; next} {print substr($0,1,4) a[FNR] substr($0,9)}' File2.txt File1.txt
abcd1234efghijklmno
abcd4321efghijklmno
abcd6543efghijklmno
abcd5678efghijklmno
  • NR==FNR{a[FNR]=$0; next}以行号为键保存File2.txt数组中的所有行a
  • print substr($0,1,4) a[FNR] substr($0,9)用于提取必要的字符并在中间substr插入行File2.txt

答案2

这看起来有点奇怪,但是:

dd if=file1 bs=1 count=4 > file3
dd if=file2 bs=1 count=4 >> file3
dd if=file1 bs=1 skip=8 >> file3  

您没有提到复制 file2 中的任何换行符,而且看起来您似乎不需要它(如果有的话)。

相关内容