在 bash 生态系统中为逗号分隔的字符串添加后缀
Add suffix to comma-separated strings in bash ecosystem
有没有一种方法可以使用标准 gnu 工具转换逗号分隔的变量以向每个标记添加后缀?例如
VARIABLE=`aaa,bbb,ccc`
suffix=`-foo`
Expected output = `aaa-foo,bbb-foo,ccc-foo`
此外,如果我只有一个标记,转换的行为应该相同
例如aaa
-> aaa-foo
echo $VARIBLE | tr "," "\n" | awk '{print "-foo"}' | paste -sd "," -
解释:
将每个标记放在一行中
tr "," "\n"
将“-foo”附加到每个标记
awk '{print "-foo"}'
加入原来的逗号
paste -sd "," -
尝试:
answer = `echo $VARIABLE | sed "s/,/-foo,/g" | sed "s/$/-foo/"`
如果您需要将后缀作为变量,请尝试:
answer = `echo $VARIABLE | sed "s/,/${suffix},/g" | sed "s/$/${suffix}/"`
我目前无法访问 Unix box 来证明它有效。
echo "aaa,bbb,ccc" | sed -E 's/([^,]+)/-foo/g'
它生成不是“,”的字符组,然后在其上附加-foo
有变量:
suffix="-foo"; VARIABLE="aaa,bbb,ccc"; echo ${VARIABLE} | sed -E "s/([^,]+)/${suffix}/g"
以下:
s="aaa,bbb,ccc"
IFS=,
a=( $s )
mapfile -t b < <(printf '%s-foo\n' "${a[@]}")
应该给我们:
$ declare -p b
declare -a b=([0]="aaa-foo" [1]="bbb-foo" [2]="ccc-foo")
从那里开始,如果您可以通过多种方式重建原始格式...
IFS=, eval 'JOINED="${b[*]}"'
或者如果您不喜欢使用 eval
,也许:
d=""; o=""
for x in "${b[@]}"; do
printf -v o '%s%s%s' "$o" "$d" "$x"
d=,
done
... 这会将完整的修改后的字符串放入 $o
.
有bash参数扩展
var='aaa,bbb,ccc';[ -n "$var" ] && printf "%s\n" "${var//,/-foo,}-foo"
有没有一种方法可以使用标准 gnu 工具转换逗号分隔的变量以向每个标记添加后缀?例如
VARIABLE=`aaa,bbb,ccc`
suffix=`-foo`
Expected output = `aaa-foo,bbb-foo,ccc-foo`
此外,如果我只有一个标记,转换的行为应该相同
例如aaa
-> aaa-foo
echo $VARIBLE | tr "," "\n" | awk '{print "-foo"}' | paste -sd "," -
解释:
将每个标记放在一行中
tr "," "\n"
将“-foo”附加到每个标记
awk '{print "-foo"}'
加入原来的逗号
paste -sd "," -
尝试:
answer = `echo $VARIABLE | sed "s/,/-foo,/g" | sed "s/$/-foo/"`
如果您需要将后缀作为变量,请尝试:
answer = `echo $VARIABLE | sed "s/,/${suffix},/g" | sed "s/$/${suffix}/"`
我目前无法访问 Unix box 来证明它有效。
echo "aaa,bbb,ccc" | sed -E 's/([^,]+)/-foo/g'
它生成不是“,”的字符组,然后在其上附加-foo
有变量:
suffix="-foo"; VARIABLE="aaa,bbb,ccc"; echo ${VARIABLE} | sed -E "s/([^,]+)/${suffix}/g"
以下:
s="aaa,bbb,ccc"
IFS=,
a=( $s )
mapfile -t b < <(printf '%s-foo\n' "${a[@]}")
应该给我们:
$ declare -p b
declare -a b=([0]="aaa-foo" [1]="bbb-foo" [2]="ccc-foo")
从那里开始,如果您可以通过多种方式重建原始格式...
IFS=, eval 'JOINED="${b[*]}"'
或者如果您不喜欢使用 eval
,也许:
d=""; o=""
for x in "${b[@]}"; do
printf -v o '%s%s%s' "$o" "$d" "$x"
d=,
done
... 这会将完整的修改后的字符串放入 $o
.
有bash参数扩展
var='aaa,bbb,ccc';[ -n "$var" ] && printf "%s\n" "${var//,/-foo,}-foo"