Ich versuche, den Inhalt einer Datei mit sed nach einem passenden Muster in eine andere Datei einzufügen. Meine Frage ist dieser Frage sehr ähnlich , aber ich möchte den Inhalt einer Datei inline und nicht in eine neue Zeile einfügen. Wie kann ich das machen?
Anhand der Beispielfrage, auf die ich verwiesen habe, macht die erste Antwort genau das, was ich will. Ich möchte jedoch, dass das Einfügen inline erfolgt:
sed '/First/r file1.txt' infile.txt
Die tatsächlichen Daten, die ich einfügen möchte, sind eine JSON-Datei:
[
{
"foo": "bar",
"baz": "biff",
"data": [
{
"a": 1945619,
"b": [
{
"c": 512665,
"d": "futz"
}
]
}
]
}
]
text-processing
sed
awk
Schildkröte
quelle
quelle
First
- duh. Es tut uns leid.sed
aber ich will nur sicher gehen ...Antworten:
In Ihrer verknüpften Frage gibt es bereits eine gute
awk
Antwort. Ändern Sie sie einfach ein wenig, indem Sie den Inhalt verwenden,printf
anstatt ihnprint
ohne Zeilenumbruch einzufügen:Ergebnis:
Möglicherweise möchten Sie nach "First" mit "Leerzeichen" oder ein anderes Delimeter hinzufügen
printf $0 " "; ...
Wenn die eingefügte Datei viele Zeilen enthält, gilt Folgendes:
Ergebnis:
quelle
[
die nach dem Mustervergleich eingefügt wird. Normaler Text funktioniert gut, aber nicht JSON?getline
in einer Zeile liest. Verwenden Sie eine Schleife umgetline
: unix.stackexchange.com/a/32911/70524awk '/First/ { while(getline line<"File1.txt"){print line} }1' infile.txt
awk '/First/ { print; while(getline line<"File1.txt"){print line} }' infile.txt
stattdessen.Sie könnten verwenden
perl
(den Dateiinhalt abrufen undpattern
durchpattern
+ ersetzenfile content
):hinzufügen
-i
, um an Ort und Stelle zu bearbeiten;g
nach jedem Auftreten von PAT (Muster) anhängen, z.Ein anderer Weg, mit
ed
:Zum Bearbeiten an Ort und Stelle ersetzen
,p
durchw
:Wahrscheinlich interessiert sich niemand dafür, wie das funktioniert, aber er
printf
übergibt trotzdem eine Liste von Befehlen aned
:Oder ohne Verwendung von
printf
und|
:quelle
ex
Dokumenten gearbeitet - ich mag dasvi
Konsolenfenster, das Sie machen können. Eine einzelne Linie oder eine einstellbare Größe oder ... na ja, wahrscheinlich viele Sachen, von denen ich einfach nie den Dreh raus hatte. Wie auch immer, ich möchte es wirklich herausfinden - ich habe nur über die POSIX-Dokumente nachgedacht. Hast du irgendwelche Empfehlungen?ed
... die POSIX-Dokumente abdecken , es gibt auch diese Seite ... Ich empfehle, das Tool für einfache Aufgaben / Experimente zu verwenden (zumindest habe ich so gelernt, nur die zu lesen docs, Kernighans kurzes Intro und Krummins ' Spickzettel ). Mit Ihrem Wissen übersed
sollten Sie keine Probleme haben. Es sei denn, Ihre Frageex
ex
ex
- was ist, wie ich es verstehe, nur eineed
Erweiterung? Eine Sache, die mich beim Spielen umgehauen hat, war der tmp-Speicher - ich habe versucht, eine große Datei zu laden und musste darauf warten. Auf der anderen Seite finde ich die unzähligen Puffer attraktiv - ich war einfach nicht gut genug, um sie effizient aufzuteilen. danke für die links.So wäre es ein wenig schwierig sein , diese Arbeit portably in machen
sed
- Sie suchen sollencut
und / oderpaste
mit einigen regex Vorläufern zu erzeugen sie Skript in diesem Zusammenhang - und das liegt daran ,sed
wird immer Einsatz einer\n
ewline vor dem Ausgang einesr
ead. Trotzdem mit GNUsed
:e
Dies funktioniert, indemcat
jedes Mal ausgeführt wird, wenn Ihre/First/
Adresse gefunden wird. Dies geschieht imh
alten Raum (eine Art - ohnehin ein alternativer Puffer - weil ich siex
ändere, geschieht dies tatsächlich im Musterraum, der früherh
alter Raum war) , um den Inhalt derFirst
Zeilenübereinstimmung beizubehalten und danncat
die Ausgabe anzuhängen zu Ihrer Linie und entfernt die dazwischenliegende\n
ewline.AUSGABE:
Wenn Sie nun möchten, dass der gesamte Inhalt der Datei zwischen zwei Teile einer Zeile passt , die etwas anders funktionieren müssen, entferne ich mit dem obigen Befehl einfach die nachfolgende neue Zeile zwischen dem Ende der übereinstimmenden Zeile und dem Anfang der Datei. Trotzdem können Sie dies auch tun:
\n
Dadurch wird die Zeile bei der Übereinstimmung mit einem Ewline-Zeichen geteilt, imh
alten Leerzeichene
gespeichert , xecutescat
- das den Musterraum durch seine Ausgabe ersetzt -G
der Inhalt des Haltebereichs, der nach einem anderen\n
Ewline-Zeichen an unseren neuen Musterraum angehängt wird, wird neu angeordnet und dann neu angeordnet\n
ewline Trennzeichen.Ich möchte
echo .
alle nachgestellten\n
Ewline-Zeichen beibehaltenfile
- aber wenn dies nicht Ihr Wunsch ist (und für Ihr Beispiel sowieso nicht sehr relevant ist) , können Sie darauf verzichten und die ersten.
zuvor.\n
in der folgendens///
Substitution entfernen.Kurz bevor der Musterbereich neu angeordnet wird, sieht er folgendermaßen aus:
AUSGABE:
quelle
s///e
Syntax ist ziemlich cool - Sie können alles damit machen, was Sie an einer Eingabeaufforderung tun könnten. Tatsächlich ist es auch ein ziemlich praktischer Eingabeaufforderungsprozessor. Ich habe damit experimentiert und einige einfachere Shells, die nicht viel für die Linienbearbeitung bieten und beeindruckt sind. Wenn Sie es jedoch verwenden, denken Sie daran, dass Sie dabei den gesamten Musterbereich entfernen. Das Ersetzen nur eines Teils beliebiger Daten und das anschließendee
Ausführen der Ergebnisse kann katastrophal sein. Ich weiß - ich war dort.