Ich versuche, den sed
Befehl zu finden, den ich einfügen kann filename
. filename1
Dies sind meine beiden separaten Dateien.
INPUT filename
hat:
Cindy 11 22 54
Chester 48 12 84
INPUT filename1
hat:
Name Class1 Class2 Class3
Lee 92 94 88
Chancy 91 85 95
Dora 99 77 96
Jefferry 84 98 90
Dies ist das Ergebnis, das ich brauche (Ausgabe):
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
Wenn ich etwas klarstellen muss, lassen Sie es mich wissen. Grundsätzlich müssen Cindy und Chester genau zwischen Dora und Jefferry liegen.
Antwort1
Um mit dem Befehl alle Zeilen von filename
bis hinzuzufügen , können Sie Folgendes tun:filename1
sed
sed r filename1 filename
Beachten Sie jedoch, dass das Ergebnis leicht von der Ausgabe in Ihrer Frage abweicht, nämlich:
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
Bearbeiten
Einige zusätzliche sed
Informationen, die für diese Frage nützlich sind:
filename
Nach der 4. Zeile hinzufügenfilename1
:sed '4 r filename' filename1
So fügen Sie
filename
nach der Zeile, die mit „Dora“ beginnt, Folgendes hinzufilename1
:sed '/^Dora/ r filename' filename1
So fügen Sie
filename
nach der 4. Zeile Folgendes hinzu und entfernen alle Leerzeilen ausfilename1
:sed '/^$/d;4 r filename' filename1
Antwort2
Wenn ich mich recht erinnere, dürfte da keine Reihenfolge vorliegen.
In diesem Fall:
$ 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
Antwort3
Wenn Sie tun:
sed r file1 file2
...dann wird versucht , an jede Eingabezeile der beiden benannten Eingabedateien sed
eine ead-Datei mit einem Dateinamen der Länge Null anzuhängen, was jedoch fehlschlägt.r
file1
Undfile2
Dieser Befehl unterscheidet sich im Wesentlichen nicht von:
sed '' file1 file2
...außer dass r
es mit langsamer ist.
Das ist was ich meine:
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
...
Sehen Sie das open("" ...)
Versagen mitENOENT
jede Zeile befolgen? Das ist der leere r
ead-Befehl sed
, der ausgeführt wird. Sie bemerken die Fehler nicht, weil sed
es so spezifiziert ist, dass es sich nicht über eine nicht vorhandene r
ead-Datei beschwert, die in seinem Skript genannt wird, sondern so weitermacht, als ob nichts passiert wäre, wenn es versucht, r
eine zu lesen.
Und vielleichtsieht ausals ob es funktioniert, weil Sie nur eine Datei an das Ende einer anderen anhängen möchten - um cat
zwei Dateien zu verbinden - was sed
standardmäßig der Fall ist, wenn zwei Eingabedateien benannt sind - es liest die erste und dann die nächste. Aber wenn der r
ead-Befehl wirklich funktionieren würde, würde die benannte r
ead-Datei vollständig angehängt werdenjedenZeile im Eingang.
So was:
seq 3 > file
printf %s\\n a b c |
sed r\ file
a
1
2
3
b
1
2
3
c
1
2
3
Um den Inhalt einer Datei an eine andere anzuhängen, haben Sie folgende Möglichkeiten:
cat < file2 >> file1
Um nur nach einer bestimmten Stelle in der Eingabe anzuhängen, haben Sie einige Optionen. sed
Dies ist eine davon:
sed -e '/match/{r file2' -e:n -e 'n;bn' -e \} file1
... das sollte mit praktisch jedem funktionieren sed
.
Oder wenn Sie ein POSIX haben sed
:
{ sed /match/q; cat file2 -; } < file1
...was weitaus effizienter sein sollte.
Beide Methoden stellen sicher, dass der Inhalt vonfile2
wird nur einmal und nur unmittelbar nach dem ersten Auftreten von in r
ausgelesenmatch
file1
.
Ein anderer Weg könnte so aussehen:
cat file2 | sed /match/r\ /dev/fd/0 file1
...das nach jeder Übereinstimmung nach der ersten eine Datei mit der Länge Null auslesen würde...