변수의 여러 공백으로 구분된 값에 문자열을 추가합니다.

변수의 여러 공백으로 구분된 값에 문자열을 추가합니다.

변수를 선언했고 VAR="XYZ YZA ZAB"변수의 모든 단어 옆에 문자열을 추가하고 싶습니다.

.file1예: 의 각 공백으로 구분된 하위 문자열에 추가하고 싶습니다 XYZ YZA ZAB.

변수의 출력은 for loop내용 없이 아래와 같아야 합니다.

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

사용할 수 있다고 확신 awk하지만 이러한 목적으로 사용하는 방법을 모르겠습니다.

답변1

그리고 ksh93:

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

zsh같은

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

POSIX적으로:

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

간단한 해결책은 쉘 분할 기능을 사용하는 것입니다(기본값은 IFS).

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

반복되는 공백/탭을 하나로 축소하고 선행 및 후행 공백을 제거한다는 점을 이해하십시오. 이렇게 하면 set -f전역 문자( )가 포함된 * ? or [파일 이름에 문제가 발생하지 않습니다. 이 경우 인쇄된 문자열에는 추가 공백이 있습니다.

답변3

의 경우 zshStéphane보다 약간 더 짧은 접근 방식이 있습니다.

$ 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

관련 정보