我需要替换文本文件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 中的任何换行符,而且看起来您似乎不需要它(如果有的话)。