用bash替换数组中的字符串

时间:2011-09-20 10:11:07

标签: arrays bash

我只需要使用bash而且我是新手

#!/opt/bin/bash
SAVEIFS=$IFS
IFS=$'\n'
array=($(mysql --host=xxxx --user=xxxx --password=xxxx -s -N -e 'use xbmc_video; SELECT strFilename FROM movie, files WHERE files.idFile=movie.idFile ORDER BY idMovie DESC LIMIT 10;'))

这会生成一个文件名数组,其中包含空格,因为我正在使用windows samba共享。问题是如何删除每个字符串中的最后4个符号以摆脱扩展而不必打扰哪个ext是我想获得纯文件名

2 个答案:

答案 0 :(得分:3)

将其添加到脚本的末尾:

for i in ${!array[@]}; do
    array[i]="${array[i]%%.???}"
done

这里使用了两个技巧:

  1. 数组索引列表:${!array[@]}see info
  2. 结尾处的模式截止:"${array[i]%%.???}"(由于文件名中的空格,必须是双引号)(see info
  3. 要确保(稍后在使用数组时)获得文件的全名,请在循环中使用以下技巧:

    for file in "${array[@]}"; do  # the double-quotes are important
        echo "$file"
    done
    

    有关详细信息,请参阅the bash hackers sitebash manual

答案 1 :(得分:0)

我会给你几个选择。首先,您可以编辑文件扩展名,作为首先生成数组的命令的一部分:

array=($(mysql --host=xxxx --user=xxxx --password=xxxx -s -N -e 'use xbmc_video; SELECT strFilename FROM movie, files WHERE files.idFile=movie.idFile ORDER BY idMovie DESC LIMIT 10;' | sed 's/[.]...$//'))

(请注意,这假定为3个字母的扩展名。如果您需要修剪任意大小的扩展名,请将sed命令更改为sed 's/[.].*$//'

其次,您可以像这样修剪整个数组中的扩展名:

trimmedarray=("${array[@]%.???}")

(同样,这假定为3个字母的扩展名;对于任何尺寸,都使用"${array[@]%.*}"