Acrescentar strings a vários valores separados por espaço em uma variável

0

Eu tenho uma variável VAR="XYZ YZA ZAB" declarada e gostaria de acrescentar algumas strings ao lado de todas as palavras dessa variável.

Por exemplo: Quero anexar .file1 a cada substring separado do espaço em XYZ YZA ZAB .

A saída da variável deve ser como abaixo sem qualquer for loop ou qualquer coisa.

VAR="XYZ.file1 YZA.file1 ZAB.file1"

Tenho certeza de que awk pode ser usado, mas não tenho conhecimento de como usá-lo para essa finalidade.

    
por sabarish jackson 06.11.2018 / 10:36

2 respostas

3

com ksh93 :

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

Mesmo com zsh :

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

POSIXly:

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

(atente para os caracteres de nova linha se houver em $VAR ).

Todos eles substituem sequências de um ou mais caracteres ( +(...) , ## , \{1,\} ) diferentes dos espaços em branco ( [^[:space:]] ) pela mesma coisa ( , $MATCH , & ) e .file1 acrescentados.

Ou você pode dividir e participar se não se importar em preservar a quantidade de espaço em branco entre palavras e palavras separadas apenas por SPC, TAB e NL (e não por outros caracteres de espaço em branco):

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

Com shells com suporte à matriz, você pode querer usar uma variável de matriz em vez de uma variável escalar. Com rc / es / zsh / ksh93 / bash / mksh / yash :

VAR=(XYZ YZA ZAB)

Em seguida, adicionar .file1 a cada elemento (que neste momento pode conter espaço em branco) é apenas uma questão de:

VAR2=($VAR^.file1) # rc, es
VAR2=($^VAR.file1) # zsh
VAR2=("${VAR[@]/*/
VAR2=${VAR//+([^[:space:]])/.file1}
.file1}") # ksh93 VAR2=("${VAR[@]/%/.file1}") # bash
    
por 06.11.2018 / 10:47
0

A solução simples será usar o recurso de divisão de shell (com um padrão IFS ):

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

Entenda que isso entrará em colapso em espaços / guias repetidos para um e que removerá o espaço em branco inicial e final. O set -f evitará problemas com nomes de arquivos que contenham caracteres glob ( * ? or [ ). A string impressa neste caso terá um espaço adicional.

    
por 10.11.2018 / 05:26