首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Make in bash添加后缀/加号的等效操作

问从Make in bash添加后缀/加号的等效操作
EN

Unix & Linux用户
提问于 2022-08-22 15:30:39
回答 3查看 302关注 0票数 2

给定一个空格分隔的单词列表,如何在不执行任何外部命令的情况下对所有单词进行前缀(或后缀)?

Make具有这样的结构:

代码语言:javascript
复制
$(addprefix foo,bar baz)
⇒ foobar foobaz
EN

回答 3

Unix & Linux用户

发布于 2022-08-22 16:05:28

使用bash5.2(目前处于beta版)或更新版本,您可以这样做:

代码语言:javascript
复制
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:

代码语言:javascript
复制
printf '%s\n' "${string//+([^ ])/\0suffix}"

或者zsh的S:

代码语言:javascript
复制
set -o extendedglob
printf '%s\n' "${string//(#m)([^ ])##/${MATCH}suffix}"
票数 3
EN

Unix & Linux用户

发布于 2022-08-22 15:36:33

可以对数组的元素使用壳参数展开。将空格分隔的列表转换为数组:

代码语言:javascript
复制
a=(bar baz bat)

然后展开它,用前缀“替换”每个项目的开头:

代码语言:javascript
复制
printf "%s " "${a[@]/#/foo}"

通过使用%,您可以以同样的方式添加后缀:

代码语言:javascript
复制
printf "%s " "${a[@]/%/foo}"

还可以在空格分隔的单词上使用shell参数展开,如果这些单词由单个空格分隔,可以分两个步骤:

代码语言:javascript
复制
w="bar baz bat"
r="${w/#/foo}"
r="${r// / foo}"

(即用前缀替换字符串的开头,并将任何空格替换为后面的前缀)。

如果启用了extglob shopt,也可以处理重复的空格:

代码语言:javascript
复制
w="bar baz bat"
r="${w/#/foo}"
r="${r//+( )/ foo}"
票数 2
EN

Unix & Linux用户

发布于 2022-08-22 15:37:55

这是不可能的空间分隔字符串,但它是有可能的数组。还可以将空格分隔的字符串转换为数组。

从变量开始,用空格分隔的单词:

代码语言:javascript
复制
words="foo bar baz"

将其转换为数组:

代码语言:javascript
复制
array=($words)

并添加后缀:

代码语言:javascript
复制
echo -- "${array[@]/%/suffix}"
⇒ foosuffix barsuffix bazsuffix

或添加前缀:

代码语言:javascript
复制
echo -- "${array[@]/#/prefix}"
⇒ prefixfoo prefixbar prefixbaz

重复添加前缀和后缀。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/714483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档