С предварительным именем:
Настройка:
$ 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
, чтобы эти ходы действительно выполнялись)
Если вы передаете такой аргумент, как $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
. что оболочка не будет.