Лучший способ завершить это регулярное выражение Perl - PullRequest
1 голос
/ 11 ноября 2010

Я пытаюсь использовать Perl-однострочник для обработки выходных данных grepping svn diff, чтобы я мог автоматически проверять файлы. У нас есть сценарий run_test.sh, который может принимать несколько файлов PHP с предустановленным «Test» в качестве аргументов.

Пока у меня есть следующее, что успешно добавляет 'Test' к именам файлов

[gjempty@gjempty-rhel4 classes]$ svn diff | grep '(revision' | perl -wpl -e 's/(.*)\/(.*)$/$1\/Test$2/'
--- commerce/TestLCart.php      (revision 104387)
--- commerce/manufacturing/TestLRoutingData.php (revision 104387)

Теперь я просто хотел бы получить файл / путь и передать его в наш run_test.sh. Я могу закончить его с помощью awk, как показано ниже, но я пытаюсь улучшить свои навыки Perl / one-liner. Итак, как мне пересмотреть однострочную версию perl, чтобы дополнительно извлечь только путь к файлу?

 svn diff | grep '(revision' | perl -wpl -e 's/(.*)\/(.*)$/$1\/Test$2/' | awk '{print $2}' | xargs run_test.sh

Ответы [ 3 ]

4 голосов
/ 11 ноября 2010

Вам нужны только имена файлов, поэтому svn st - это то, что вам нужно. Вместо того, чтобы получать большое количество шума, который может содержать (revision, и основных строк, которые вы хотите, вы получите это так: M commerce/LCart.php. Затем вы можете просто отрубить \S* (любое количество непробельных символов), затем \s* (любое количество пробельных символов) и взять то, что осталось. Вы можете сделать \S*\s* по-другому, но это самый простой способ получить все случаи.

svn st | perl -wpl -e 's|\S*\s*(.*)/(.*)$|$1/Test$2|'

(переключил его после публикации с использованием s /// на s |||, чтобы / не нужно было экранировать; хорошая идея, Аксеман.)

3 голосов
/ 11 ноября 2010

Вы можете довольно легко избавиться от grep и awk.

svn diff | perl -wnl -e '/\(revision/ or next; m|(\S+)/(\S+)|; print "$1/Test$2";'

Я изменил -p на -n.-p означает while (<>) { <your code>; print $_; }, а -n - это то же самое, но без print, поскольку в новой версии вместо него явно указан print.

Вместо подстановки s/// я использовал m// образец соответствия.Я изменил разделитель на |, чтобы избежать косой черты (причина синдрома наклоняющейся зубочистки).Вы можете использовать практически любой знак пунктуации, который вам нужен.

\S аналогичен ., но соответствует только непробельным символам.Ваши .* в шаблоне фактически совпадали со всеми фрагментами строки до и после косой черты, но новый шаблон соответствует только пути к файлу.Поскольку + является «жадным», первый ($1) получит больше строки, когда в пути будет несколько косых черт, так же, как и в вашем шаблоне подстановки.

2 голосов
/ 11 ноября 2010

Лучшая версия:

  • Нет печати по умолчанию (-n)
  • Извлечь подстроку первой
  • Субстанцию ​​на этом
  • print значение

    perl -wnl -e '($_)=m{---\s+(\S+)} and s|/([^/]+)$|/Test$1| and print "$_\n";'
    

Вам не нужно awk сейчас.И добавив '(revision к выражению,

perl -wnl -e '($_)=m{---\s+(\S+)\s+\(revision} and s|/([^/]+)$|/Test$1| and print "$_\n";'

вам также не понадобится grep.

Но у меня есть несколько инструментов подрывной деятельности, которые я создал, и если вам нужно толькоизмененные файлы 'svn st' лучше.

svn st | perl -wnle 'm/^[CM]\s+(\S+)/and$r=rindex($1,"/")+1and print substr($1,0,$r),"Test",substr($1,$r+1),"\n"'

На этот раз я выбрал rindex + substr метод.Теперь есть нет возврата к регулярному выражению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...