sabarish jackson Asked: 2018-11-07 01:36:47 +0800 CST2018-11-07 01:36:47 +0800 CST 2018-11-07 01:36:47 +0800 CST 将字符串附加到变量中的多个空格分隔值 772 我VAR="XYZ YZA ZAB"声明了一个变量,我想在该变量中的所有单词旁边附加一些字符串。 例如:我想附加.file1到XYZ YZA ZAB. 变量的输出应该如下所示,没有任何for loop或任何东西。 VAR="XYZ.file1 YZA.file1 ZAB.file1" 我确信awk可以使用,但我不知道如何将其用于此目的。 awk sed 3 个回答 Voted Best Answer Stéphane Chazelas 2018-11-07T01:47:52+08:002018-11-07T01:47:52+08:00 与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 user232326 2018-11-10T20:26:08+08:002018-11-10T20:26:08+08:00 简单的解决方案是使用外壳拆分功能(默认IFS): $ set -f; printf '%s.file1 ' $var; echo XYZ.file1 YZA.file1 ZAB.file1 了解这会将重复的空格/制表符折叠为一个,并且它将删除前导和尾随空格。这set -f将避免包含全局字符 ( * ? or [) 的文件名的问题。在这种情况下打印的字符串将有一个额外的空间。 calandoa 2021-04-16T09:03:32+08:002021-04-16T09:03:32+08:00 有了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
与
ksh93
:与
zsh
:POSIXly:
(请注意,它会删除尾随的换行符(如果有
$VAR
)。它们都用相同的东西 ( , , )替换一个或多个 (
+(...)
,##
,\{1,\}
) 字符的序列而不是空白字符 ( ) 并附加。[^[:space:]]
\1
$MATCH
&
.file1
或者,如果您不关心保留单词之间的空白量并且单词仅由 SPC、TAB 和 NL(而不是其他空白字符)分隔,则可以拆分和加入:
使用支持数组的 shell,您可能希望使用数组变量而不是标量变量。与
rc
/es
/zsh
/ksh93
/bash
/mksh
/yash
:然后添加
.file1
到每个元素(这一次可能包含空格本身)只是一个问题:简单的解决方案是使用外壳拆分功能(默认
IFS
):了解这会将重复的空格/制表符折叠为一个,并且它将删除前导和尾随空格。这
set -f
将避免包含全局字符 (* ? or [
) 的文件名的问题。在这种情况下打印的字符串将有一个额外的空间。有了
zsh
,这里有一个比 Stéphane 的方法短一点的方法:=
执行字符串的分词,然后^
将后缀“分配”到每个单词。http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion