Awk

將字元串附加到變數中的多個空格分隔值

  • April 15, 2021

VAR="XYZ YZA ZAB"聲明了一個變數,我想在該變數中的所有單詞旁邊附加一些字元串。

例如:我想附加.file1XYZ YZA ZAB.

變數的輸出應該如下所示,沒有任何for loop或任何東西。

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

我確信awk可以使用,但我不知道如何將其用於此目的。

ksh93

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

zsh

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

POSIXly:

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

使用支持數組的 shell,您可能希望使用數組變數而不是標量變數。與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

引用自:https://unix.stackexchange.com/questions/480071