我可以使用以下示例执行此操作。第一个命令将从file1
输出第16 ... 80行到patch
,而第二个命令会在第18行之后将patch
的内容插入file2
:
sed -n 16,80p file1>patch
sed -i 18rpatch file2
但是,我想直接从一个文件复制到另一个文件而不使用中间的临时文件,在一个命令中使用sed(不是awk等)。我很确定这是可能的,只是不知道如何。
答案 0 :(得分:5)
使用sed执行此操作需要一些额外的shell技巧。假设bash,你可以使用
sed -i 18r<(sed '16,80!d' file1) file2
其中<(sed '16,80!d' file1)
替换为可从中读取sed '16,80!d' file1
输出的管道名称。
一般来说,我觉得用awk做这个更好(如果再长一点),因为awk能更好地处理多个输入文件。例如:
awk 'NR == FNR { if(FNR >= 16 && FNR <= 80) { patch = patch $0 ORS }; next } FNR == 18 { $0 = patch $0 } 1' file1 file2
其工作原理如下:
NR == FNR { # While processing the first file
if(FNR >= 16 && FNR <= 80) { # remember the patch lines
patch = patch $0 ORS
}
next # and do nothing else
}
FNR == 18 { # after that, while processing the first file:
$0 = patch $0 # prepend the patch to line 18
}
1 # and print regardless of whether the current
# line was patched.
但是,这种方法不适合文件的就地编辑。这通常不是问题;我只是使用
cp file2 file2~
awk ... file1 file2~ > file2
还有一个额外的好处,即如果事情变成梨形,那么备份就更好了,但最终还是取决于你。
答案 1 :(得分:3)
我做了类似的事情:
head -80 file | tail -16 > patch
查看本地版本 head 和 tail 的文档,并更改两个整数以满足您的要求。
答案 2 :(得分:0)
>>> max_prime_product(27)
(26, (2, 13))
sed -i '1,15 d
34 r patch
81,$ d' YourFile
# oneliner version
sed -i -e '1,15 d' -e '34 r patch' -e '81,$ d' YourFile
但在这种情况下添加一些关于行数的安全性。
sed -i "1,16 d
$(( 16 + 18 )) r patch
81,$ d" YourFile
行超过1行,则以下行仍在原始位置计算,最终文件大于80 - 16行我没有完全测试所拍摄,排除或修改的行(如34是裁剪文件的第18行),但是principe是相同的
对此示例中使用的行索引引用的解释:
r
是要删除的标题行,因此在这种情况下,文件从16开始处理1,15
是更改内容的行,是第一个新内容后的第18行结果(在我们的案例中为第16行)所以16 + 18 = 34 34
是要删除的尾随行,81,$
表示最后一行,81是不需要的尾随行的第一行(在80之后)。答案 3 :(得分:0)
我遇到了这个问题,我分2步(1尾2头)做到了这一点,例如,在一个20行(test.txt)的文本文件中,我们希望将13到17行复制到另一个文件中(final.txt),
尾部-8 test.txt> temp.txt
头-5 temp.txt> final.txt