SED Zeilenumbruch einfügen nach 2 Strings?

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 ....

Woher ich das weiß:Berufserfahrung – openSuSE seit 1995

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

0
@Nilsco187

wenn

FAN6,N/A,N/A,OK
.....

das Ergebnis mit joe ist , dann hast du immer nur <Strg> vor a, n ... vergessen.

1
@Nilsco187

Du kannst beim sed mehrere -e angeben, und s/./\U&/g macht auch das upper case...

0

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)

1
@iQa1x

wenn das Hausaufgaben sind, dann gehören solche Fragen ohnehin hier nicht her.

0
@Nilsco187

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.

0

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

Woher ich das weiß:eigene Erfahrung – Ich benutze seit 2007 Linux und habe LPIC101 und LPIC102
sed 'N;s/\n/ /;'
Woher ich das weiß:Studium / Ausbildung – Informatiker

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.

0
@Nilsco187

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

0