如何使用 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

....這將在第一場比賽後的每場比賽後讀取一個空長度檔...

相關內容