SED Zeilenumbruch einfügen nach 2 Strings?
Guten Tag
Folgendes Problem:
Ich muss folgenden Text bearbeiten
++++++++++++++++++++
"Fan 6"
"OK"
"Fan 4"
"OK"
"Fan 1"
"OK"
"Fan 5"
"OK"
"Fan 2"
"OK"
"Fan 3"
"OK"
++++++++++++++++++++
Dieser sollte jedoch so aussehen :
++++++++++++++++++++
"Fan 6""OK"
"Fan 4""OK"
"Fan 1""OK"
"Fan 5""OK"
"Fan 2""OK"
"Fan 3""OK"
++++++++++++++++++++
Ich habe versucht zuerst alle auf eine Linie zu kriegen mit : tr -d '\n'
Dan habe ich pobiert mit sed das ganze hinzukriegen. Jedoch habe ich es nicht hin gekriegt.
Wie kann man mein Ziel erreichen ?
Danke
3 Antworten
für einmalige Ausgaben benutze ich in so einem Falle die Lern-Funktion des Text-Editors joe
Lade die Datei
joe "Datei-mit-Funx-und-folgende-zeile-mit-ok"
gehe zum Anfang
tippe ein: ^ steht nachfolgend für <Strg> bzw. <Ctrl>
^k[
gib jetzt eine beliebige Ziffer ein (ich nehme man die 1 ) ein
^e<Enter>
(der Cursor springt an des Ende der Zeile)
tippe ein Leerzeichen ein (oder soll zwischen "Fan6" und "OK" keines sein, dann nicht)
^w
(die nächste Zeile wird an das Ende der ersten Zeile angefügt)
^a
(der Cursor bewegt sich zum Anfang der Zeile)
^n
(der Cursor bewegt sich in die nächste Zeile)
^k]
(Anschluss der Lernfunktion)
Wenn du jetzt immer wieder ^k1 eintippst, wird genau das ausgeführt, was du wolltest.
Es geht schneller mit ^k\ und anschließend die Anzahl wie oft das nachfolgende
Kommando ausgeführt werden soll.
z.B. 100
und dann ^k1
Bei der einfachen Aufgaben kann man auch ^ halten und wank] hintereinander eingeben.
Es muss da nicht bei solchen Zeilenumbrüchen bleiben. joe kann auch suchen, ersetzten ....
wenn das Hausaufgaben sind, dann gehören solche Fragen ohnehin hier nicht her.
habe ich da was verpasst?
Als ich mich vor 10 Jahren bei gutefrage.net angemeldet habe, stand das in den Richtlinien. Entsprechende Fragen wurden auch regelmäßig gelöscht, schließlich soll man ja lernen und sich nicht lernen lassen (feines Deutsch?).
Details solche Operationen in Fragen gepackt, würde ich durchgehen lassen, denn wer manche Man-Pages versteht, ist selbst schuld.
Hier soll aber alles in eine Zeile passen. Das geht wahrscheinlich. die Syntax von sed und anderen Tools kommt aber noch aus einer Zeit als Computer noch 100kByte RAM hatten. Ich würde daher solch "unlesbaren" Steueranweisungen
einfach umgehen.
Du darfst es wohl nicht.
Leider handelt es sich nicht um eine Einfache Ausgabe.
Habe es mit sed hingekriegt der Befehl sieht nun so aus :
sed 'N;s/\n/ /;' | sed -e 's/^"//' | sed -e 's/"$//' | tr [:lower:] [:upper:] | sed -e 's/"//' | sed -e 's/ //g' | sed -e 's#"#,N/A,N/A,#g'
Damit komme ich von :
"Fan 6"
"OK"
"Fan 4"
"OK"
"Fan 1"
"OK"
"Fan 5"
"OK"
"Fan 2"
"OK"
"Fan 3"
"OK"
zu :
FAN6,N/A,N/A,OK
FAN4,N/A,N/A,OK
FAN1,N/A,N/A,OK
FAN5,N/A,N/A,OK
FAN2,N/A,N/A,OK
FAN3,N/A,N/A,OK
wenn
FAN6,N/A,N/A,OK
.....
das Ergebnis mit joe ist , dann hast du immer nur <Strg> vor a, n ... vergessen.
Du kannst beim sed mehrere -e angeben, und s/./\U&/g macht auch das upper case...
Hallo
Ich muss folgenden Text bearbeiten
- Woher kommt denn die Datei bzw. deren Inhalt, wer oder was erstellt die?
Es wäre nämlich der richtige Ansatz dort anzusetzen statt eine Umgehung (Workarround) für vorherige Fehlbehandlung zu erstellen.
Statt sed würde ich bei dieser Aufgabe eher auf tr setzen, da ist das leicht machbar:
cat eingangsdatei | tr "\n" " " > ausgangsdatei
Konkret:
echo -e '"Fan 6"\n"OK"
"Fan 6"
"OK"
wird dann damit zu:
echo -e '"Fan 6"\n"OK"' | tr "\n" " "
"Fan 6""OK"
Wenn es denn eine Lösung mit sed sein muss sieht die so aus:
echo -e '"Fan 6"\n"OK"' | sed ':a;N;$!ba;s/\n/ /g'
"Fan 6" "OK"
Linuxhase
sed 'N;s/\n/ /;'
Kennen sie ein gutes Tutorial oder sonstige erklärung mit sed ?
Ich nutze ein Buch dazu. Jedoch wird der Parameter N; nicht erklärt.
Vielen Dank für die Lösung.
Steht im Manual. Tutorial habe ich unter https://tty1.net/sed-tutorium/index.html gefunden, aber nicht nachgeschaut, ob da "N" drin steht. 'N' hängt die nächste Zeile an, mit Newline, dass dann gleich ersetzt wird.
In der Manpage zu sed steht folgendes:
man sed | grep ' N '
n N Read/append the next line of input into the pattern space.
Linuxhase
Editor war zwar glaube ich nicht gefragt, aber das geht in vim auch: "qaJjq100@a" :)
qa - Makro "a" aufnehmen
J - nächste Zeile joinen
j - eine Zeile tiefer
q - Makroaufzeichnung beenden
100@a - 100 Mal Makro a ausführen (oder halt bis Dateiende, Zahl muss nur groß sein)