Добавить строки к нескольким значениям, разделенным пробелами в переменной

Podrías intentar algo como:

declare -fx $(bash -c 'source /path/to/my-file &> /dev/null; compgen -A function')

Dado que desea exportar solo funciones del archivo, obtenerlo en una nueva instancia de bash y luego usar compgen -A functionenumerará los nombres de todas las funciones definidas en ese archivo (y las funciones exportadas previamente también, pero eso no debería ser un problema aquí ). Luego puede usar la salida de eso con export -fo declare -fxpara exportar esas funciones.

Como está obteniendo el archivo en su bashrc, -volver a obtenerlo probablemente no será un problema.

2
06.11.2018, 14:20
3 ответа

Сksh93:

VAR2=${VAR//+([^[:space:]])/\1.file1}

То же, что иzsh:

set -o extendedglob
VAR2=${VAR//(#m)[^[:space:]]##/$MATCH.file1}

POSIXly:

VAR2=$(printf '%s\n' "$VAR" | sed 's/[^[:space:]]\{1,\}/&.file1/g')

(будьте осторожны, он удаляет завершающие символы новой строки, если они есть в$VAR).

Все они заменяют последовательности из одного или нескольких (+(...), ##,\{1,\})символов, отличных от пробелов ([^[:space:]]), на одно и то же (\1, $MATCH,&.file1. добавлено.

Или вы можете разделить и объединить, если вы не заботитесь о сохранении количества пробелов между словами, а слова разделены SPC, TAB и NL (, а не другими пробелами )только:

unset IFS # default IFS of SPC+TAB+NL
set -o noglob # disable glob
set -- $VAR # split+glob without glob
for i do
  set -- "$@" "$i.file1" # add suffix
  shift
done
VAR2="$*" # join with space

В оболочках с поддержкой массивов вы можете использовать переменную массива вместо скалярной. С rc/ es/ zsh/ ksh93/ bash/ mksh/yash:

VAR=(XYZ YZA ZAB)

Затем добавление .file1к каждому элементу (, который на этот раз может содержать пробелы ), является просто вопросом:

VAR2=($VAR^.file1) # rc, es
VAR2=($^VAR.file1) # zsh
VAR2=("${VAR[@]/*/\0.file1}") # ksh93
VAR2=("${VAR[@]/%/.file1}") # bash
2
28.04.2021, 23:40

Простым решением будет использование возможности разделения оболочки (со значением по умолчаниюIFS):

$ set -f; printf '%s.file1 ' $var; echo
XYZ.file1 YZA.file1 ZAB.file1

Имейте в виду, что при этом повторяющиеся пробелы/вкладки будут свернуты в один и удалены начальные и конечные пробелы -. set -fпозволит избежать проблем с именами файлов, которые содержат символы глобуса(* ? or [). Печатная строка в этом случае будет иметь дополнительный пробел.

1
28.04.2021, 23:40

С zshздесь путь немного короче, чем у Стефана:

$ VAR="XYZ YZA ZAB"     
$ VAR=( ${^=VAR}.file ) 
$ print -l $VAR
XYZ.file
YZA.file
ZAB.file

=выполняет разбиение строки на слова, затем ^"распределяет" суффикс для каждого слова.

http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion

0
28.04.2021, 23:40

Теги

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