2017-02-16 5 views
0

Ich bin ein automatisiertes vor-Festschreibung Skript based in the Carlos Buenos Vinos tutorial, aber das große Problem ist: Ich arbeite in einer Firma, die Windows in den Dev-Computern verwenden (Ich weiß, ich weiß, und ich kann nicht tu nichts über diese sry).EGREP und AWK gleichwertigen Befehl in Windows

Das Skript hat die folgende Methode:

private function extractCommitedFiles() 
{ 
    $output = array(); 
    $rc = 0; 

    exec('git rev-parse --verify HEAD 2> /dev/null', $output, $rc); 

    $against = '4b825dc642cb6eb9a060e54bf8d69288fbee4904'; 
    if ($rc == 0) { 
     $against = 'HEAD'; 
    } 

    // unix/linux 
    // exec("git diff-index --cached --name-status $against | egrep '^(A|M)' | awk '{print $2;}'", $output); 
    // windows 
    exec("git diff-index --cached --name-status $against | egrep '^(A|M)' | awk '{print $2;}'", $output); 

    return $output; 
} 

So ... hat jemand auf die Linie unten eine Idee zu einem äquivalenten Befehl hat?

exec("git diff-index --cached --name-status $against | egrep '^(A|M)' | awk '{print $2;}'", $output); 

Ich habe folgendes Ergebnis muss, wenn ich diesen Befehl in UNIX/Bash ausführen:

core/web/favicon.ico       
core/web/htaccess.txt      
core/web/index.html       
core/web/slim.php       
core/web/swagger/css/print.css    
core/web/swagger/css/reset.css    
core/web/swagger/css/screen.css    
core/web/swagger/css/style.css    
core/web/swagger/css/typography.css   
core/web/swagger/fonts/DroidSans-Bold.ttf   

Aber mit exec (‘... ohne die egrep und awk Befehle ich folgendes habe Ergebnisse:

A  core/web/htaccess.txt      
A  core/web/index.html       
A  core/web/slim.php       
A  core/web/swagger/css/print.css    
A  core/web/swagger/css/reset.css    
A  core/web/swagger/css/screen.css    
A  core/web/swagger/css/style.css    
A  core/web/swagger/css/typography.css   
A  core/web/swagger/fonts/DroidSans-Bold.ttf 

Thank u guys

+0

ich kann. Aber ich versuche, die Aufgabe zu automatisieren, weil wir andere Entwickler haben und die Idee ist, das Skript, das den Job ohne zusätzliche manuelle Aufgaben erledigt. Ich komme mit dem Befehl ** git ls-files -m ** aber es gibt keine Option -a für hinzugefügte Dateien :( –

+0

Der egrep-Befehl lässt nur diese Zeilen durch, die mit A oder M beginnen. Der awk-Befehl druckt nur die "zweite Spalte" ist der Dateiname. So erhalten Sie die Dateien hinzugefügt oder geändert. –

+0

Es sollte nicht schwer sein, Ihr eigenes Programm zu ändern, um diesen Teil auszuführen - Zeilen überspringen, die nicht mit 'A' oder' M' beginnen ; Überspringe das erste Feld und das Leerzeichen danach und erhalte den Dateinamen aus dem Rest der Zeile. (Das Awk-Skript würde für alle Dateinamen mit Leerzeichen in ihren Namen falsch funktionieren.) – tripleee

Antwort

0

Sie Windows-Versionen der Werkzeuge herunterladen und das ist fach hinzuzufügen! er auf die PATH-Variable.

http://gnuwin32.sourceforge.net/packages/gawk.htm http://gnuwin32.sourceforge.net/packages/grep.htm

Für "egrep" können Sie "grep -E" verwenden. "gawk" wird in Ihrem Fall genau wie "awk" funktionieren.

+0

Ich könnte. Aber ich versuche, die Aufgabe zu automatisieren, weil wir andere Entwickler haben und die Idee ist, das Skript zu versionieren, das den Job ohne zusätzliche manuelle Aufgaben erledigen wird. –

2

Zunächst ist dieser Befehl ein schlechtes Beispiel. Es ist fast nie notwendig, grep und awk in der gleichen Pipeline zu verwenden, da awk wesentlich leistungsfähiger ist. So sollte der Befehl

awk '/^(A|M)/ {print $2}' 

Zweitens zu

verkürzt werden, auch das ist ein schlechtes Beispiel, da git diff-index verschiedene Ausgabeoptionen, einschließlich --name-only und --diff-filter, die als

kombiniert werden können
git diff-index --cached --name-only --diff-filter=AM $against