Используйте Bash Perl для извлечения подстроки из вывода команды - PullRequest
0 голосов
/ 03 февраля 2020

Давайте предположим, что текст, с которым я работаю, это (который выводится pecl install xdebug):

  |   - A list of all settings:  https://xdebug.org/docs-settings.php    |
  |   - A list of all functions: https://xdebug.org/docs-functions.php   |
  |   - Profiling instructions:  https://xdebug.org/docs-profiling2.php  |
  |   - Remote debugging:        https://xdebug.org/docs-debugger.php    |
  |                                                                      |
  |                                                                      |
  |   NOTE: Please disregard the message                                 |
  |       You should add "extension=xdebug.so" to php.ini                |
  |   that is emitted by the PECL installer. This does not work for      |
  |   Xdebug.                                                            |
  |                                                                      |
  +----------------------------------------------------------------------+


running: find "/tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2" | xargs ls -dils
1078151    4 drwxr-xr-x 3 root root    4096 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2
1078337    4 drwxr-xr-x 3 root root    4096 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2/usr
1078338    4 drwxr-xr-x 3 root root    4096 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2/usr/local
1078339    4 drwxr-xr-x 3 root root    4096 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2/usr/local/lib
1078340    4 drwxr-xr-x 3 root root    4096 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2/usr/local/lib/php
1078341    4 drwxr-xr-x 3 root root    4096 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2/usr/local/lib/php/extensions
1078342    4 drwxr-xr-x 2 root root    4096 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2/usr/local/lib/php/extensions/no-debug-non-zts-20180731
1078336 2036 -rwxr-xr-x 1 root root 2084800 Feb  3 17:40 /tmp/pear/temp/pear-build-defaultuserNxuIJy/install-xdebug-2.9.2/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so

Build process completed successfully
Installing '/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so'
install ok: channel://pecl.php.net/xdebug-2.9.2
configuration option "php_ini" is not set to php.ini location
You should add "zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so" to php.ini

Я хочу извлечь эту часть из этого вывода и сохранить ее в переменной для дальнейшего использования. используйте:

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so

Я пытался сделать это с Perl безуспешно:

echo $OUTPUT | perl -lne 'm/You should add "(.*)"/; print $1'

Как получить подстроку динамически с perl? Какой шаблон мне нужен?

Ответы [ 3 ]

6 голосов
/ 03 февраля 2020

С текстом $OUTPUT, помещенным в файл output.txt

cat output.txt | perl -wnE'say $1 if /You should add "(zend_extension=.*)"/'

При этом используются специфические особенности отображаемого текста, в частности уникальное предисловие zend_extension=... для пути, чтобы различать guish нужная строка из более раннего шаблона " Вы должны добавить ". При необходимости измените на то, что больше подходит для вашей проблемы.

Если текст вставляется в одну строку как одна строка в вашем коде, тогда добавьте флаг -0777 для проверки.

В противном случае, пожалуйста, уточните, как это происходит $OUTPUT.


Протестировано с помощью bash script

#!/bin/bash
# Last modified: 2020 Feb 03 (12:58)

OUTPUT=$(cat "output.txt")

echo $OUTPUT | perl -wnE'say $1 if /You should add "(zend_extension=.*)"/'

, где output.txt - файл с текстом из вопроса, и правая строка печатается.

2 голосов
/ 03 февраля 2020

Вы можете использовать это perl:

perl -lne 'print $1 if /You should add "(?!extension=xdebug\.so)([^"]+)"/' <<< "$OUTPUT"

zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20180731/xdebug.so

Отрицательный прогноз (?!extension=xdebug\.so) будет игнорировать строку extension=xdebug.so в выводе.

В качестве альтернативы вы можете соответствовать You should add в начале строки:

perl -lne 'print $1 if /^You should add "([^"]+)"/' <<< "$OUTPUT"
0 голосов
/ 04 февраля 2020

Вероятно, OP должен использовать

echo $OUTPUT | perl -ne 'm/You should add "(.*)"/ && print $1'

или

echo $OUTPUT | perl -ne 'print $1 if m/You should add "(.*)"/'

...