将子字符串添加到bash中的字符串

时间:2019-04-02 20:16:01

标签: bash

我有以下数组:

SPECIFIC_FILES=('resources/logo.png' 'resources/splash.png' 'www/img/logo.png' 'www/manifest.json')

以及以下变量:

CUSTOMER=default

如何遍历数组并生成看起来像这样的字符串

resources/logo_default.png

取决于变量。

3 个答案:

答案 0 :(得分:3)

下面使用parameter expansion提取相关的子字符串,如BashFAQ #100中所述:

specific_files=('resources/logo.png' 'resources/splash.png' 'www/img/logo.png' 'www/manifest.json')
customer=default

for file in "${specific_files[@]}"; do
  [[ $file = *.* ]] || continue               # skip files without extensions
  prefix=${file%.*}                           # trim everything including and after last "."
  suffix=${file##*.}                          # trim everything up to and including last "."
  printf '%s\n' "${prefix}_$customer.$suffix" # concatenate results of those operations
done

此处小写的变量名与POSIX-specified conventions保持一致(全大写字母的名称用于对操作系统或shell有意义的变量,而保留至少一个小写字符的变量供应用程序使用用途;设置常规的shell变量会覆盖任何名称相同的环境变量,因此约定适用于两个类。

答案 1 :(得分:1)

这是sed的解决方案:

for f in "${SPECIFIC_FILES[@]}"; do 
    echo "$f" | sed "s/\(.*\)\.\([^.]*\)/\1_${CUSTOMER}.\2/p"
done

答案 2 :(得分:1)

如果您知道每个文件名只有一个句点,则可以直接在每个元素上使用扩展名:

$ printf '%s\n' "${SPECIFIC_FILES[@]/./_"$CUSTOMER".}"
resources/logo_default.png
resources/splash_default.png
www/img/logo_default.png
www/manifest_default.json

如果不这样做,查尔斯的答案就是涵盖所有情况的可靠答案。