Как добавить суффикс и префикс к [email protected]
?
Если я делаю $PREFIX/[email protected]/$SUFFIX
, я получаю префикс и суффикс только в первом параметре.
[email protected] bash - программирование" />
Как добавить суффикс и префикс к [email protected]
?
Если я делаю $PREFIX/[email protected]/$SUFFIX
, я получаю префикс и суффикс только в первом параметре.
Я бы использовал shell [расширение параметра] для этого
set -- one two three
echo "[email protected]"
one two three
set -- "${@/#/pre}" && set -- "${@/%/post}"
echo "[email protected]"
preonepost pretwopost prethreepost
Примечания
#
соответствует началу%
соответствует концу${@}
рассматривает каждый элемент как отдельное слово. поэтому замена происходит для каждого позиционного параметраСоздайте параметры для тестовых целей:
$ set -- one two three
$ echo "[email protected]"
one two three
Теперь, используйте bash для добавления префиксов и суффиксов:
$ IFS=$'\n' a=($(printf "pre/%s/post\n" "[email protected]"))
$ set -- "${a[@]}"
$ echo -- "[email protected]"
pre/one/post pre/two/post pre/three/post
Ограничения: (a) поскольку это использует строки, разделенные символом строки, это не сработает, если ваш [email protected]
содержит новые строки. В этом случае может быть еще один выбор для IFS
, который будет достаточным. (b) Это подлежит глобированию. Если одна из этих проблем является проблемой, см. Более общее решение ниже.
С другой стороны, если позиционные параметры не содержат пробелов, то никаких изменений в IFS
не требуется.
Кроме того, если IFS
изменено, тогда можно предварительно сохранить IFS
и восстановить его позже.
Если мы не хотим делать какие-либо предположения о пробеле, мы можем изменить "$ @" с помощью цикла:
$ a=(); for p in "[email protected]"; do a+=("pre/$p/post"); done
$ set -- "${a[@]}"
$ echo "[email protected]"
pre/one/post pre/two/post pre/three/post
Примечание. Это по существу немного более подробная версия sjam answer.
ответ John1024 полезен, но:
К счастью, параметр Bash может быть применен и к массивам, что позволяет избежать этих проблем:
set -- 'one' 'two' # sample input array, which will be reflected in [email protected]
# Copy [email protected] to new array ${a[@]}, adding a prefix to each element.
# `/#` replaces the string that follows, up to the next `/`,
# at the *start* of each element.
# In the absence of a string, the replacement string following
# the second `/` is unconditionally placed *before* each element.
a=( "${@/#/PREFIX}" )
# Add a suffix to each element of the resulting array ${a[@]}.
# `/%` replaces the string that follows, up to the next `/`,
# at the *end* of each element.
# In the absence of a string, the replacement string following
# the second `/` is unconditionally placed *after* each element.
a=( "${a[@]/%/SUFFIX}" )
# Print the resulting array.
declare -p a
Это дает:
declare -a a='([0]="PREFIXoneSUFFIX" [1]="PREFIXtwoSUFFIX")'
Обратите внимание, что двойные ссылки на ссылки на массивы имеют решающее значение для защиты своих элементов от потенциального расщепления слов и глобализации (расширение имени файла) - оба из которых являются экземплярами расширения оболочки.