给定一个空格分隔的单词列表,如何在不执行任何外部命令的情况下对所有单词进行前缀(或后缀)?
Make具有这样的结构:
$(addprefix foo,bar baz)
⇒ foobar foobaz发布于 2022-08-22 16:05:28
使用bash5.2(目前处于beta版)或更新版本,您可以这样做:
bash-5.2$ shopt -s extglob patsub_replacement
bash-5.2$ string='foo bar baz'
bash-5.2$ printf '%s\n' "${string//+([^ ])/&suffix}"
foosuffix barsuffix bazsuffix相当于93‘S:
printf '%s\n' "${string//+([^ ])/\0suffix}"或者zsh的S:
set -o extendedglob
printf '%s\n' "${string//(#m)([^ ])##/${MATCH}suffix}"发布于 2022-08-22 15:36:33
可以对数组的元素使用壳参数展开。将空格分隔的列表转换为数组:
a=(bar baz bat)然后展开它,用前缀“替换”每个项目的开头:
printf "%s " "${a[@]/#/foo}"通过使用%,您可以以同样的方式添加后缀:
printf "%s " "${a[@]/%/foo}"还可以在空格分隔的单词上使用shell参数展开,如果这些单词由单个空格分隔,可以分两个步骤:
w="bar baz bat"
r="${w/#/foo}"
r="${r// / foo}"(即用前缀替换字符串的开头,并将任何空格替换为后面的前缀)。
如果启用了extglob shopt,也可以处理重复的空格:
w="bar baz bat"
r="${w/#/foo}"
r="${r//+( )/ foo}"发布于 2022-08-22 15:37:55
这是不可能的空间分隔字符串,但它是有可能的数组。还可以将空格分隔的字符串转换为数组。
从变量开始,用空格分隔的单词:
words="foo bar baz"将其转换为数组:
array=($words)并添加后缀:
echo -- "${array[@]/%/suffix}"
⇒ foosuffix barsuffix bazsuffix或添加前缀:
echo -- "${array[@]/#/prefix}"
⇒ prefixfoo prefixbar prefixbaz重复添加前缀和后缀。
https://unix.stackexchange.com/questions/714483
复制相似问题