suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Beitrag von joe2017 » 05.09.2019 10:48:36

Hallo zusammen,

ich hab ein kleines Problem mit dem sed Befehlt. Generell ist das suchen und ersetzen in Files kein Problem.

Code: Alles auswählen

sed -i 's/telephoneNumber: /-\nreplace: telephoneNumber\ntelephoneNumber: /g' /path/to/file
vorher
telephoneNumber: 123456

nachher
-
replace: telephoneNumber
telephoneNumber: 123456



Jetzt möchte ich jedoch folgendens ersetzten. Die Telefon Nummer ist variable und nicht bekannt.
vorher
telephoneNumber: 123456
telephoneNumber: 234567


nachher
-
replace: telephoneNumber
telephoneNumber: 123456
-
add: telephoneNumber
telephoneNumber: 234567


Mit dem oben genannten Befehl würde alles ersetzt werden.

Code: Alles auswählen

sed -i 's/telephoneNumber: /-\nreplace: telephoneNumber\ntelephoneNumber: /g' /path/to/file
-
replace: telephoneNumber
telephoneNumber: 123456
-
replace: telephoneNumber
telephoneNumber: 234567


Aber wie bekomme ich das zweite replace zu einem add wenn zwei aufeinanderfolgende Zeilen mit "telephoneNumber" angegeben sind?
Hier komme ich irgendwie nicht weiter und wäre über einen Tipp dankbar.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Beitrag von Meillo » 05.09.2019 11:02:44

Verstehe ich das richtig, dass du in dem Fall, wenn zwei aufeinanderfolgende Zeilen jeweils mit ``telephoneNumber'' beginnen, die erste mit ``replace'' und die zweite mit ``add'' ersetzt werden soll? Was steht in der Datei sonst noch? Gibt es nur genau einmal dieses ``telephoneNumber'' (entweder als Einzelzeile oder als Doppelzeile) in der Datei? Es waere hilfreich eine moeglichst realitaetsnahe (nur anonymisierte) Datei zu haben.

Wenn es nur genau eine (ein- oder zweizeilige) Telefonnummernangabe gibt, dann kannst du z.B. die erste mit ``replace'' ersetzen und direkt danach mit `q' beenden. Dann mit einem zweiten Aufruf die verbleibenden mit ``add'' ersetzen. Wenn die Inputdatei anders aussieht geht das natuerlich nicht.

Wenn du auf die Inplace-Aenderung verzichten kannst, dann wird das Leben mit awk leichter.
Use ed once in a while!

Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

Re: suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Beitrag von joe2017 » 05.09.2019 11:10:01

Hallo Meillo,

Genau so habe ich das vor.
Das kommt ganz auf die Abfrage meines Benutzers an. Es kann sein, dass nur ein User mit einer Nummer vor kommt, oder mehrere Benutzer mit nur einer Nummer, oder vielleicht auch ein Benutzer mit mehreren bzw. mehrere Benutzer nit mehreren Nummern. Es ist quasi nicht vorhersehbar wie oft oder ob überhaut mehrere Nummern aufeinanderfolgend vorkommen. Das kommt ganz auf die Abfrage an.

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Beitrag von Meillo » 05.09.2019 11:27:50

In awk kannst du etwas in der Art machen (ungetestet):

Code: Alles auswählen

{
	if ($0 ~ /^telephoneNumber/) {
		if (inblock) {
			print "-\nadd: telephoneNumber"
		} else {
			print "-\nreplace: telephoneNumber"
			inblock = 1
		}
	} else {
		inblock = 0
	}
	print
}
Nur hast du halt kein inplace, sondern musst die Ergebnisdatei umkopieren.
Use ed once in a while!

Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

Re: suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Beitrag von joe2017 » 05.09.2019 11:33:21

Hallo Meillo,

cool das werde ich mir dann gleich mal anschauen. :-)
Vielen Dank schon mal für den Tipp.

Benutzeravatar
joe2017
Beiträge: 1274
Registriert: 07.08.2017 14:29:51

Re: suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Beitrag von joe2017 » 05.09.2019 16:03:37

Ich hätte noch eine kleine Frage zu einem ähnlichen Thema.

Ich habe eine Variable und möchte diese in zwei Variablen aufteilen.
Beispiel:
var1 soll zu var2 und var3 aufgeteilt werden.
var1="+49 12345 +49 23456"
Ergebnis
var2="+49 12345"
var3="+49 23456"


var2 kann ich ganz einfach mit folgendem Befehl erstellen

Code: Alles auswählen

echo ${var1%+*}
+49 12345

bei var3 komme ich mit der syntax nicht ganz klar. Hier wird mir das "+" abgeschnitten. Wie kann ich das "+" Zeichen mitnehmen und vor dem "+" abschneiden?

Code: Alles auswählen

echo ${var1##*+}
49 23456

Benutzeravatar
Meillo
Moderator
Beiträge: 9225
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: suchen & ersetzten mit sed - zwei aufeinanderfolgende zeilen abgleichen

Beitrag von Meillo » 05.09.2019 17:00:49

joe2017 hat geschrieben: ↑ zum Beitrag ↑
05.09.2019 16:03:37
var2 kann ich ganz einfach mit folgendem Befehl erstellen

Code: Alles auswählen

echo ${var1%+*}
+49 12345
Das ist nicht ganz exakt, und macht nur eher zufaellig was du meinst, da das Leerzeichen am Ende durch das fehlende Quoting irgnoriert wird. Siehe:

Code: Alles auswählen

:-Q echo ${var1%+*} | od -c   
0000000   +   4   9       1   2   3   4   5  \n
0000012

:-Q echo "${var1%+*}" | od -c
0000000   +   4   9       1   2   3   4   5      \n
0000013

:-Q echo "${var1% +*}" | od -c
0000000   +   4   9       1   2   3   4   5  \n
0000012
Die letzte Variante ist das was du haben willst.
bei var3 komme ich mit der syntax nicht ganz klar. Hier wird mir das "+" abgeschnitten. Wie kann ich das "+" Zeichen mitnehmen und vor dem "+" abschneiden?

Code: Alles auswählen

echo ${var1##*+}
49 23456
Das ist einfach, vermutlich so einfach, dass du gar nicht drauf gekommen bist:

Code: Alles auswählen

echo "+${var1##*+}"
+49 23456
;-)
Use ed once in a while!

Antworten