Вы можете заменить последний блок на sed
, используя маркер конца строки ($
).
#/bin/bash
for file in *_* ; do
#any alphanumeric string as suffix
mv $file $( sed 's/_\([A-Za-z0-9]\{1,\}\)$/.\1/' <<< $file )
#alternatively numbers only as in given input sample
mv $file $( sed 's/_\([0-9]\{1,\}\)$/.\1/' <<< $file )
done
AFAIK \{1,\}
бит как "один или более" из предыдущего списка - это GNU sed
- но я не уверен на 100% в этом ограничении.
Перед вызовом envsubst
вы должны использовать экспорт с использованием одинарных кавычек, чтобы вернуть измененный VAR_1
. Как в:
export VAR_1='somevalue'
Для получения дополнительных сведений см .:
Согласно странице руководства:
envsubst [OPTION] [SHELL-FORMAT]
Если задан SHELL-FORMAT, заменяются только те переменные среды, на которые ссылаются в SHELL-FORMAT; в противном случае все ссылки на переменные среды , встречающиеся в стандартном вводе, заменяются .
Где строки SHELL-FORMAT - это "строки со ссылками на переменные оболочки в форме $ variable
или $ {variable}
[...] Имена переменных должны состоять исключительно из буквенно-цифровых символов или символов подчеркивания ASCII, не начинаться с цифры и быть непустым; в противном случае такая ссылка на переменную игнорируется ». .
Итак, нужно передать имена соответствующих переменных в envsubst
в строке формата оболочки (очевидно, их нужно экранировать / заключать в кавычки, чтобы передавать буквально в ] envsubst
). Пример:
входной файл, например infile
:
VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}
и некоторые значения, такие как
export VAR1="one" VAR2="two" VAR3="three"
, затем запуск
envsubst '${VAR1} ${VAR3}' <infile
,
envsubst '${VAR1},${VAR3}' <infile
или
envsubst '${VAR1}
${VAR3}' <infile
выводит
VAR1=one
VAR2=${VAR2}
VAR3=three
Или, если вы предпочитаете обратную косую черту:
envsubst \$VAR1,\$VAR2 <infile
производит
VAR1=one
VAR2=two
VAR3=${VAR3}