Использование имен переменных bash в качестве замены соответствия в командной строке подстановки регулярного выражения perl - PullRequest
3 голосов
/ 25 сентября 2019

Я пытаюсь заменить подстроки, разделенные символами в строке, значениями соответствующих им переменных bash в оболочке.

До сих пор я пробовал это без какого-либо успеха:

varone="noob"
vartwo="trivial"
echo "my {varone} and {vartwo} question" | perl -pe 's|(.*){(\w+)}(.*)|${1}'$(echo "${'${2}'}")'${3}|g'

Но я получаю:

bash: ${'${2}'}: bad substitution

Есть идеи, как это сделать?Заранее спасибо!

Ответы [ 4 ]

5 голосов
/ 25 сентября 2019

Не генерируйте Perl-код из оболочки! Это не просто .

Вместо генерации кода передайте значения в скрипт. Этот ответ показывает пару способов передачи значений в однострочник Perl.Здесь проще всего экспортировать переменные, которые вы хотите интерполировать.

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" |
   perl -pe's/\{(\w+)\}/$ENV{$1}/g'

Это также означает, что вы можете интерполировать другие переменные, такие как PATH.Если это нехорошо, вам придется каким-то образом проверить, является ли имя переменной допустимым.

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" |
   perl -pe's/\{(varone|vartwo)\}/$ENV{$1}/g'
5 голосов
/ 25 сентября 2019

Ваша главная проблема здесь заключается в том, что вам нужно использовать export для того, чтобы ваши переменные были видны в ваших подпроцессах (например, perl процесс).

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" | perl -pe '...'

Вам также необходимо знатьчто переменные оболочки доступны внутри Perl-программы с использованием хеша %ENV.

Таким образом, ваш код может быть упрощен до:

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" | perl -pe 's|\{(\w+)}|$ENV{$1}|g'

Вы можете рассмотреть возможность добавления опции для проверки неизвестных переменных.

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question {varxxx}" | perl -pe 's|\{(\w+)}|$ENV{$1}//"UNKNOWN"|g'

Но я бы порекомендовал для этого правильный шаблонизатор .

1 голос
/ 25 сентября 2019

Используйте export для доступа к переменным bash в сценариях Perl:

Попробуйте:

export varone="noob"
export vartwo="trivial"
echo "my {varone} and {vartwo} question" | perl -pe 's|(.*){(\w+)}(.*){(\w+)}(.*)|${1}${ENV{$2}}${3}${ENV{$4}}${5}|g'

Пример

echo "my {varone} and {vartwo} question" | perl -pe 's|(.*){(\w+)}(.*){(\w+)}(.*)|${1}${ENV{$2}}${3}${ENV{$4}}${5}|g'
my noob and trivial question
0 голосов
/ 25 сентября 2019

Вот еще один подход:

echo "my {varone} and {vartwo} question" | \
     perl -wpE 'BEGIN{ %h = @ARGV;@ARGV=() } s|{(\w+)\}|$h{$1}|g' \
     "varone" "$varone" "vartwo" "$vartwo" 

Вывод :

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