2017-11-29 4 views
1

Ich schreibe ein Korn Shell-Skript, wo ich versuche, über bestimmte Zeilen im git diff Ergebnis einer Datei zu iterieren. Für diejenigen, die nicht wissen, git diff listet die Änderungen an einer Datei gemacht, und seine Ausgabe wird in etwa wie folgt aussehen (nur Linien 3 und 5 geändert vorausgesetzt):Suche git diff-Ausgabe für bestimmte Arten von Änderungen

unchanged line 1 
unchanged line 2 
- previous version of line 3 
+ new version of line 3 
unchanged line 4 
- previous version of line 5 
+ new version of line 5 

ich dieses Ergebnis gespeichert in einer Zeichenfolge Variable (zB diff), und ich muss über jede Zeile in diff beginnend mit einem + oder einem - (zum Beispiel - previous version of line 3) iterieren. Die intuitivste Lösung ist offensichtlich, über jede Zeile in diff zu iterieren und etwas wie if line contains + or - zu verwenden, aber ich kann das nicht tun, da diff kein Array von separaten Zeilen ist, sondern eine Zeichenfolge, die durch \n an Orten getrennt ist.

Also was ich am Ende suche ist eine Möglichkeit, jeden Teil der Zeichenfolge zwischen zwei \n Zeichen zu extrahieren.

Wie erreiche ich das in Korn Shell? Oder vielleicht könnt ihr bessere Alternativen vorschlagen?

+0

Und Sie haben versagt 'in diese zu markieren korn' .. Btw, einen Zweifel. Unterstützt korn shell keine bashähnlichen Arrays? – sjsam

+0

@sjsam Korn wird nicht als Tag angezeigt, wenn ich danach suche. Es zeigte sich bis gestern. Und Korn unterstützt Arrays. Schlägst du vor, ich extrahiere jeden Teil des Ergebnisses zwischen zwei '\ n' Zeichen und verschiebe es in ein Array? – lebowski

+0

Ich glaube nicht, dass Sie es extrahieren müssen. Sie können immer eine Befehlsersetzung innerhalb eines Array-Operators durchführen. In Bezug auf die Korn-Tag, tut mir leid, dass dann – sjsam

Antwort

1

Below Ansatz sollte

git diff | grep '^[+-]' | while read -r -d$'\n' line 
do 
if [ ! -z "$line" ] 
# The last line would always be empty, but cond. above is an overkill anyway 
then 
# Do something useful with "$line" 
fi  
done 

passen Da Sie Linien mit entweder + oder - beginnen muss ich haben eine grep zu hinzugefügt Zeilen zu filtern.


Hinweis: verwendet ksh 93u+ 2012-08-01 Emulator [ here ] gefunden

+0

'diff = ($ (git diff))' scheint jeden Teil des Git-Diff-Ergebnisses getrennt durch ein Leerraumzeichen in ein separates Element des Arrays gebracht zu haben. Also sind 'unverändert', 'Zeile' und '1' alle separate Elemente des Arrays. Ich hoffe, jede Zeile als separates Element des Arrays zu haben. – lebowski

+0

@lebowski: In der Tat habe ich das bemerkt und das ist nicht was du wolltest. Also siehe Bearbeiten ... – sjsam

+1

Das hat funktioniert. Vielen Dank! – lebowski

Verwandte Themen