
変数を宣言し、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
答え2
簡単な解決策はシェル分割機能を使用することです(デフォルトはIFS
)。
$ set -f; printf '%s.file1 ' $var; echo
XYZ.file1 YZA.file1 ZAB.file1
繰り返されるスペース/タブを 1 つに縮小し、先行スペースと末尾のスペースを削除することを理解してください。これにより、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