如何使用 sed 从另一个文件添加新行

如何使用 sed 从另一个文件添加新行

我正在尝试找到该sed命令,以便我可以将filename其放入filename1.这是我的两个单独的文件。

输入filename有:

Cindy   11 22 54
Chester 48 12 84

输入filename1有:

 Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96


Jefferry 84     98     90

这是我需要的结果(输出):

Name   Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Cindy    11     22     54
Chester  48     12     84
Jefferry 84     98     90

如果我需要澄清任何事情,请告诉我。基本上,辛迪和切斯特必须介于朵拉和杰弗里之间。

答案1

要使用命令添加从filename到 的所有行,您可以执行以下操作:filename1sed

sed r filename1 filename

但请注意,结果将与您问题中的输出略有不同,即:

Name  Class1 Class2 Class3
Lee      92     94     88
Chancy   91     85     95
Dora     99     77     96
Jefferry 84     98     90
Cindy    11     22     54
Chester  48     12     84

编辑

sed对于这个问题有用的一些附加信息:

  • filename在第 4 行之后添加filename1

    sed '4 r filename' filename1

  • 要在以下行中添加filename以“Dora”开头的行filename1

    sed '/^Dora/ r filename' filename1

  • filename要在第 4 行之后添加并从中删除所有空白行filename1

    sed '/^$/d;4 r filename' filename1

答案2

如果我没记错的话不应该有任何顺序。

在这种情况下:

$ cat file2 file1 | column -t
Name      Class1  Class2  Class3
Lee       92      94      88
Chancy    91      85      95
Dora      99      77      96
Jefferry  84      98      90
Cindy     11      22      54
Chester   48      12      84

答案3

如果你这样做:

sed r file1 file2

...然后sed将尝试将r具有空长度文件名的 ead 文件附加到其命名输入文件的每个输入行,但失败file1file2。该命令本质上与以下命令没有什么不同:

sed '' file1 file2

...除了速度r较慢之外。

这就是我的意思:

seq 1  5 > file1
seq 6 10 > file2
strace sed r file[12]

...
write("1\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("2\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("3\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("4\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("5\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
read(3, "", 4096) = 0
close(3) = 0
open("file2", RDONLY) = 3
write("6\n", 21) = 2
open("", O_RDONLY) = -1 ENOENT (No such file or directory)
write("7\n", 21) = 2
...

查看open("" ...)失败的情况ENOENT遵循写出的每一行?这就是空read 命令sed运行的情况。您不会注意到这些失败,因为sed规范不会抱怨r其脚本中指定的不存在的 ead 文件,而是在尝试r读取文件时继续执行,就好像什么也没发生一样。

也许它看起来就像它的工作原理一样,因为您只想将一个文件附加到另一个文件的末尾 - 连接cat两个文件 -sed默认情况下,当两个输入文件被命名时 - 它读取第一个文件,然后读取下一个文件。但如果read 命令确实有效,那么命名的read 文件将完全附加到每一个输入中的行。

像这样:

seq 3 > file
printf %s\\n a b c | 
sed r\ file

a
1
2
3
b
1
2
3
c
1
2
3

要将一个文件的内容附加到另一个文件,您可以执行以下操作:

cat < file2 >> file1

要仅在输入中的某个点之后附加,您有一些选择。sed其中:

sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1

...几乎可以与任何sed.

或者如果你有 POSIX sed

{ sed /match/q; cat file2 -; } < file1

...这应该更有效率。

两种方法都确保内容file2只读r出一次,并且只在第一次出现matchin之后立即读出file1

另一种方式可能如下所示:

cat file2 | sed /match/r\ /dev/fd/0 file1

...这将在第一场比赛之后的每场比赛后读取一个空长度文件...

相关内容