ubuntuusers.de

Linux: bash: patch-Befehl

Status: Ungelöst | Ubuntu-Version: Xubuntu 20.04 (Focal Fossa)
Antworten |

Umaash

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Da ich meine Patch-Datei nicht durch den Vergleich von 2 Dateien erstellen kann, muss ich meine Patch-Datei auf eine andere Weise erstellen.

Das ist meine Patch-Datei:

1
2
3
4
5
--- OriginalDatei.txt
+++ aenderung
@@ -1,13 +1,2 @@
-#
-d

Das ist der Inhalt der Datei OriginalDatei.txt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
1
2
3
4
#
d
5
6
7
#
d
8
9

Frage: Weshalb erhalte ich die folgende Meldung im Terminal? Was ist nicht in Ordnung mit Zeile 5?:

1
2
3
$ patch OriginalDatei Diff.txt -o Output.txt
patching file Output.txt (read from OriginalDatei)
patch: **** malformed patch at line 5: 

(Der Patch soll 2x die beiden Zeilen ...

1
2
#
d

... aus der Original-Datei entfernen.)

Hilfe würde mich freuen. Besten Dank.

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 4625

1. Orginaldatei kopieren und die gewünschten Änderungen in der Kopie vornehmen.

2. Dann mit diff eine Datei mit den Unterschieden erstellen:

diff -uN Old New > Patch.diff

3. New löschen oder verschieben, denn das soll ja durch den Patch aus Old erstellt werden.

4. Patchen:

patch < Patch.diff

Edit: Jeweils einen Artikel über diff und patch gibt es auch im ubuntuusers.de Wiki:

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Danke @trollsportverein.

Das ist das Ergebnis:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
--- OriginalDatei.txt	2024-02-06 10:27:50.778553758 +0100
+++ aenderung	2024-02-06 12:43:43.506625831 +0100
@@ -2,13 +2,8 @@
 2
 3
 4
-#
-d
 5
 6
 7
-#
-d
 8
 9
-

Daraus kann man schon einige Vermutungen anstellen. Aber die Funktionsweise der Zeile...

@@ -2,13 +2,8 @@

... verstehe ich auch nicht ganz.

Es heisst -2,13 würde bedeuten, dass 2 die erste Zeile der Originaldatei sei, die geändert wird und 13 die letzte Zeile der Originaldatei sei, die geändert wird. Weiter heisst es, dass in +2,8 "2" die erste Zeile sei, die in der geänderten Datei geändert wird und 8 die letzte Zeile sei, die in der geänderten Datei geändert wird.

Nun habe ich die Patch-Datei zu Forschungszwecken manuell etwas abgeändert, so dass ich jetzt folgendes habe:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
--- OriginalDatei.txt	2024-02-06 10:27:50.778553758 +0100
+++ aenderung	2024-02-06 12:43:43.506625831 +0100
@@ -4,13 +4,8 @@
 4
-#
-d
 5
 6
 7
-#
-d
 8
 9
-

Frage: Weshalb bekomme ich jetzt bei der Anwendung mit obigen Dateien die folgende Meldung?:

Hunk #1 succeeded at 4 with fuzz 2.

Weshalb muss er jetzt auf fuzzi-Logik zurückgreifen?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13121

Umaash schrieb:

Frage: Weshalb bekomme ich jetzt bei der Anwendung mit obigen Dateien die folgende Meldung?:

Hunk #1 succeeded at 4 with fuzz 2.

Weil der Inhalt nicht mehr da verortet wird, wo er steht (4,13) und patch die Stelle trotzdem findet.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Danke. Das ist jetzt aber sehr kurz erklärt.

Ich habe doch ...

2
3

... gelöscht und dann auch

@@___@@

um diese 2 Zeilen angepasst. Dann sollte es doch wieder stimmen.

Die Änderung, die in der modifizierten patch-Datei drin stehen beginnen doch in der Originaldatei bei Zeile 4 und auch in der geänderten Datei bei Zeile 4. Und das passt genau zur modifizierten Patch-Datei.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4658

Wohnort: Berlin

Es fehlen halt die beiden Zeilen. Patch geht nicht nur nach den Angaben in der @ … @-Zeile sondern sucht auch nach den unveränderten Zeilen die im Diff stehen, eben um bei bereits geänderten Dateien, wo sich die Zeilenzahlen verschoben haben, trotzdem noch zu (ver)suchen wo das denn angewendet werden sollte/könnte. Also nicht einfach unveränderte Kontextzeilen aus dem Diff löschen. Patch erwartet ab der Zeilennummer 4 nämlich erst einmal zwei unveränderte Zeilen um darauf in der Datei prüfen zu können.

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Der Patch erwartet also erst einmal zwei unveränderte Zeilen um darauf in der Datei prüfen zu können. Immer "2" Zeilen?

Nun habe ich zu Forschungszwecken den Start des Patch' auf Zeile 1 verlegt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
--- OriginalDatei.txt	2024-02-06 10:27:50.778553758 +0100
+++ aenderung	2024-02-06 12:43:43.506625831 +0100
@@ -1,13 +1,8 @@
 1
 2
 3
 4
-#
-d
 5
 6
 7
-#
-d
 8
 9
-

Aber auch hier wird reklamiert. Allerdings ist das eine andere Meldung. Wieso funktioniert dieser Patch nicht?: Output:

1
patch: **** malformed patch at line 16:  9

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 4625

Der diff Schalter -u macht per default 3 lines of unified context.

-u, -U NUM, --unified[=NUM] output NUM (default 3) lines of unified context

man diff

Umaash

(Themenstarter)

Anmeldungsdatum:
7. Juni 2016

Beiträge: 123

Danke verstehe.

Die 3 Lines sind dann wohl in der OriginalDatei.txt diese markierten Teile:

1
2
3
4
#
d
5
6
7
#
d
8
9
|

Und in der Datei aenderung diese Zeilen:

1
2
3
4
5
6
7
8
9
|

Richtig? Und deshalb startet die Patch-Datei ausgerechnet bei Zeile 2.

Könnte man ...

-u, -U NUM, --unified[=NUM] output NUM (default 3) lines of unified context

... auch auf 0 stellen?

Denn ich denke, das ist es was ich brauche um einen bestimmten Zeilenblock zu löschen von dem ich nicht weiss, wo er in der Originaldatei genau ist.

trollsportverein

Avatar von trollsportverein

Anmeldungsdatum:
21. Oktober 2010

Beiträge: 4625

Umaash schrieb:

[...] einen bestimmten Zeilenblock zu löschen von dem ich nicht weiss, wo er in der Originaldatei genau ist.

Dafür gäbe es auch noch sed.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13121

trollsportverein schrieb:

Umaash schrieb:

[...] einen bestimmten Zeilenblock zu löschen von dem ich nicht weiss, wo er in der Originaldatei genau ist.

Dafür gäbe es auch noch sed.

Man kann da auch schön mit relativen Werten arbeiten, wenn man z.B. eine Zeile erkennen kann und weiß, dass eine bestimmte Anzahl Zeilen folgen, die gelöscht werden sollen:

1
2
3
4
5
6
7
8
$ seq 10 20 | sed '/5/,+3d'
10
11
12
13
14
19
20

Antworten |