Замените переменные окружения в тексте, если они существуют

С предварительным именем:

Настройка:

$ mkdir test && cd test
$ > "foo bar XXX doo par.jpg"; > "foo bar YY YY doo par.jpg"

Действие:

$ rename -n 's/^foo bar //; s/ doo par(\.[^.]*)$/$1/'  *
  foo bar XXX doo par.jpg renamed as XXX.jpg
  foo bar YY YY doo par.jpg renamed as YY YY.jpg

(Удалите -n , чтобы эти ходы действительно выполнялись)

3
06.01.2019, 10:49
1 ответ

Если вы передаете такой аргумент, как $USER$PATHв envsubst, тогда он раскрывает только те переменные, на которые есть ссылки в этом аргументе.

Таким образом, одним из способов может быть передача всех текущих переменных среды в этом формате. Сzsh:

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst \$${(kj:$:)parameters[(R)*export*]}
  • $parameters— это специальный ассоциативный массив, который сопоставляет имена переменных с их типом
  • $parameters[(R)*export*]расширяется до всех элементов ассоциативного массива, значение которых содержит export.
  • с флагом расширения параметра kвместо значения возвращается ключ
  • j:$:объединяет эти элементы с $между ними, и мы добавляем один в начале.

В других оболочках вы всегда можете вернуться к perl, чтобы получить этот список:

echo 'Hello $USER ${USER} $UNDEFINED_VARIABLE' |
  envsubst "$(perl -e 'print "\$$_" for grep /^[_a-zA-Z]\w*$/, keys %ENV')"

Остерегайтесь раскрывать имена переменных среды в выводе ps.

Вместо этого вы также можете сделать все это вperl:

perl -pe 's{(?|\$\{([_a-zA-Z]\w*)\}|\$([_a-zA-Z]\w*))}{$ENV{$1}//$&}ge'

Остерегайтесь, что он имеет те же ограничения, , что и envsubst, в том, что он не будет расширять такие вещи, как ${VAR:-x}, и расширит $HOMEтакие вещи, как \$HOMEили $$HOME. что оболочка не будет.

2
27.01.2020, 21:17

Теги

Похожие вопросы