変数の複数のスペースで区切られた値に文字列を追加します。

変数の複数のスペースで区切られた値に文字列を追加します。

変数を宣言し、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つ以上の(+(...)、、、)文字シーケンスを##同じ文字(、、、)に置き換えて追加します。\{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

おすすめ記事