So wäre es ein wenig schwierig sein , diese Arbeit portably in machen sed
- Sie suchen sollen cut
und / oder paste
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 eines r
ead. Trotzdem mit GNU sed
:
sed '/First/{x;s/.*/cat file/e;H;x;s/\n//}' <<\IN
First
Second
Third
IN
e
Dies funktioniert, indem cat
jedes Mal ausgeführt wird, wenn Ihre /First/
Adresse gefunden wird. Dies geschieht im h
alten Raum (eine Art - ohnehin ein alternativer Puffer - weil ich sie x
ändere, geschieht dies tatsächlich im Musterraum, der früher h
alter Raum war) , um den Inhalt der First
Zeilenübereinstimmung beizubehalten und dann cat
die Ausgabe anzuhängen zu Ihrer Linie und entfernt die dazwischenliegende \n
ewline.
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
\n
Dadurch wird die Zeile bei der Übereinstimmung mit einem Ewline-Zeichen geteilt, im h
alten Leerzeichen e
gespeichert , xecutes cat
- 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 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 .\n
in 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