변수를 선언했고 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
의 경우 zsh
Sté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