Попытка использовать результат регулярного выражения в переменной в Bash - PullRequest
0 голосов
/ 30 апреля 2018

Я следовал инструкциям здесь: Извлечение подстроки с использованием RegExp в Plain Bash

Я не могу заставить мой код работать должным образом:

Это правильно звучит:

for filename in ./unsent_xmls/*.xml; do
    echo $filename |  perl -lne 'print $& if /(\d{4})(?=-)/'
done

но когда я пытаюсь это вывести пустой результат:

for filename in ./unsent_xmls/*.xml; do
    package=$filename |  perl -lne 'print $& if /(\d{4})(?=-)/'
    echo $package
done

Я пробовал несколько разных итераций.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Есть две проблемы.

  1. package=$filename не производит вывод, который будет передан в perl
  2. package устанавливается только в подоболочке, которая проходит с левой стороны конвейера; не устанавливается после завершения конвейера.

Если вам нужны только 4 цифры, предшествующие первой - в имени файла, используйте

for filename in ./unset_xmls/*.xml; do
    [[ $filename =~ ([[:digit:]]{4})- ]] && package=${BASH_REMATCH[1]}
    echo "$package"
done
0 голосов
/ 30 апреля 2018

Три вещи: вам все еще нужно echo в конвейере, вам нужно $( ) для захвата вывода из конвейера, чтобы вы могли присвоить его переменной, и вы должны использовать двойные кавычки вокруг ссылок на переменные (для исключить возможные странности):

for filename in ./unsent_xmls/*.xml; do
    package=$(echo "$filename" |  perl -lne 'print $& if /(\d{4})(?=-)/')
    echo "$package"
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...