So wäre es ein wenig schwierig sein , diese Arbeit portably in machen sed- Sie suchen sollen cutund / oder pastemit einigen regex Vorläufern zu erzeugen sie Skript in diesem Zusammenhang - und das liegt daran , sedwird immer Einsatz einer \newline vor dem Ausgang eines read. Trotzdem mit GNU sed:
sed '/First/{x;s/.*/cat file/e;H;x;s/\n//}' <<\IN
First
Second
Third
IN
eDies funktioniert, indem catjedes Mal ausgeführt wird, wenn Ihre /First/Adresse gefunden wird. Dies geschieht im halten Raum (eine Art - ohnehin ein alternativer Puffer - weil ich sie xändere, geschieht dies tatsächlich im Musterraum, der früher halter Raum war) , um den Inhalt der FirstZeilenübereinstimmung beizubehalten und dann catdie Ausgabe anzuhängen zu Ihrer Linie und entfernt die dazwischenliegende \newline.
AUSGABE:
First[
{
"foo": "bar",
"baz": "biff",
"data": [
{
"a": 1945619,
"b": [
{
"c": 512665,
"d": "futz"
}
]
}
]
}
]
Second
Third
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:
sed '/First/{s//&\n/;h
s/.*/{ cat file; echo .; }/e;G
s/\(.*\).\n\(.*\)\n/\2\1/
}' <<\IN
Third
Second
First Second Third
Third
Second
First Second Third
IN
\nDadurch wird die Zeile bei der Übereinstimmung mit einem Ewline-Zeichen geteilt, im halten Leerzeichen egespeichert , xecutes cat- das den Musterraum durch seine Ausgabe ersetzt - Gder Inhalt des Haltebereichs, der nach einem anderen \nEwline-Zeichen an unseren neuen Musterraum angehängt wird, wird neu angeordnet und dann neu angeordnet \newline Trennzeichen.
Ich möchte echo .alle nachgestellten \nEwline-Zeichen beibehalten file- 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 .\nin der folgenden s///Substitution entfernen.
Kurz bevor der Musterbereich neu angeordnet wird, sieht er folgendermaßen aus:
^cat's output - any number of newlines.*.\nmatch on First\nrest of match$
AUSGABE:
Third
Second
First[
{
"foo": "bar",
"baz": "biff",
"data": [
{
"a": 1945619,
"b": [
{
"c": 512665,
"d": "futz"
}
]
}
]
}
] Second Third
Third
Second
First[
{
"foo": "bar",
"baz": "biff",
"data": [
{
"a": 1945619,
"b": [
{
"c": 512665,
"d": "futz"
}
]
}
]
}
] Second Third