2017-02-16 17 views
0

Я строю автоматический сценарий предварительной фиксации based in the Carlos Buenos Vinos tutorial, но проблема BIG: я работаю в компании, использующей Windows в компьютерах-разработчиках (знаю, что знаю, и я не могу ничего не делайте по этому поводу).EGREP и AWK эквивалентная команда в Windows

Сценарий имеет следующий метод:

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; 
} 

Итак ... Кто-нибудь есть идея для эквивалентной команды в линии сильфона?

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

я должен иметь следующий результат, если я запускаю эту команду в UNIX/Bash:

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   

Но использование EXEC (»... без AWK и задать расширенные команды я имеющая следующие результаты:

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 

Спасибо у ребят

+0

я мог. Но я пытаюсь автоматизировать задачу, потому что у нас есть другие разработчики, и идея - это версия скрипта, который выполнит эту работу без каких-либо дополнительных ручных задач. Я сближаюсь с командой ** git ls-files -m **, но нет опции -a для добавленных файлов :( –

+0

Команда egrep позволяет только этим линиям через это начинаться с A или M. Команда awk просто печатает «второй столбец», который является именем файла. Таким образом, вы получаете файлы, добавленные или измененные. –

+0

Неплохо будет изменить свою собственную программу для выполнения этой части - пропустить строки, которые не начинаются с 'A' или' M' , пропустите первое поле и пробелы после него и извлеките имя файла из остальной части строки (сценарий Awk будет работать некорректно для любых имен файлов с пробелами в их именах.) – tripleee

ответ

0

Вы можете загрузить Windows версии инструментов и добавьте бен раз! er к переменной PATH.

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

Для "задать расширенное" вы можете использовать "Grep -E". «gawk» выполнит работу точно так же, как «awk» в вашем случае.

+0

Я мог бы. Но я пытаюсь автоматизировать задачу, потому что у нас есть другие разработчики, и идея заключается в версировании сценария, который будет выполнять эту работу без каких-либо дополнительных ручных задач. –

2

Прежде всего эта команда является плохим примером. Вряд ли когда-либо необходимо использовать grep и awk в том же трубопроводе, поскольку awk значительно более мощный. Таким образом, команда должна быть сокращена до

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

Во-вторых, даже это плохой пример, поскольку git diff-index имеет различные варианты вывода, в том числе --name-only и --diff-filter, которые могут быть объединены в

git diff-index --cached --name-only --diff-filter=AM $against