SED:将文件中的行复制到另一个文件中的特定行

时间:2015-08-26 10:03:00

标签: bash sed gnu gnome-terminal

我可以使用以下示例执行此操作。第一个命令将从file1输出第16 ... 80行到patch,而第二个命令会在第18行之后将patch的内容插入file2

sed -n 16,80p file1>patch
sed -i 18rpatch file2

但是,我想直接从一个文件复制到另一个文件而不使用中间的临时文件,在一个命令中使用sed(不是awk等)。我很确定这是可能的,只是不知道如何。

4 个答案:

答案 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