使用Bash替换数组中的字符串

4
我需要仅使用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个符号,以去除扩展名,而无需烦恼想要获取哪个扩展名,只需获取纯文件名。

2个回答

6
将以下内容添加到您的脚本末尾:
for i in ${!array[@]}; do
    array[i]="${array[i]%%.???}"
done

这里使用了两个技巧:

  1. 数组索引列表:${!array[@]} (参见信息)
  2. 从末尾截取的模式:"${array[i]%%.???}"(必须用双引号括起来,因为文件名中有空格)(参见信息)

为了确保在循环中使用数组时可以获取整个文件名,请使用以下技巧:

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

更多信息请参阅bash黑客网站bash手册


谢谢您的回复,我想我仍然没有完全理解整个概念。现在如果文件名中包含逗号,这个技巧就失效了,那个文件名也不会有任何变化。 - zero
1
我已经编辑了模式替换方法,以“从末尾开始计数”方式截取结尾(请参见http://wiki.bash-hackers.org/syntax/pe?s[]=replace#substring_removal)。 - Rajish

1
我会给你几个选项。首先,你可以在生成数组的命令中将文件扩展名编辑掉:
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/[.]...$//'))

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

其次,您可以像这样从整个数组中削减扩展名:

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

(再次说明,这里假定文件扩展名为3个字母,如果有其他长度,请使用"${array[@]%.*}"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接