【发布时间】:2017-01-19 15:23:59
【问题描述】:
我想从当前目录中提取所有具有一个特定扩展名 (.com) 的文件的名称,而不使用它们的扩展名,并将它们存储在一个数组中。
这是我尝试过的:
test=$((*.com) | sed 's/.com//g')
我得到了错误
zsh:权限被拒绝:1butene.com
1butene.com 是我拥有的文件。
感谢您的帮助!
【问题讨论】:
标签: arrays linux sed terminal filenames
我想从当前目录中提取所有具有一个特定扩展名 (.com) 的文件的名称,而不使用它们的扩展名,并将它们存储在一个数组中。
这是我尝试过的:
test=$((*.com) | sed 's/.com//g')
我得到了错误
zsh:权限被拒绝:1butene.com
1butene.com 是我拥有的文件。
感谢您的帮助!
【问题讨论】:
标签: arrays linux sed terminal filenames
您当前正在存储一组名称,然后通过管道传输到sed。当 glob 展开时,这将成为表单上的命令:
1butene.com xxxx | sed 's/.com//g'
这显然是不允许的,因为1butene.com 本身并不是一个命令。
你要做的就是
1) 存储数据,
2) 进行清洁。
为此,我们有好消息!你可以执行Shell parameter expansion on arrays!
这样你可以将数据存储在一个数组中:
names=(*.com)
然后将它们全部替换为extracting its name,不带扩展名:
printf "%s\n" "${names[@]%.*}"
如果你想change values of bash array elements without loop,只需使用语法
new_array=("${names[@]%.*}")
示例:
$ touch a{1..3}.{sql,com}
$ com_names=(*com)
$ printf "%s\n" "${com_names[@]}"
a1.com
a2.com
a3.com
$ printf "%s\n" "${com_names[@]%.*}"
a1
a2
a3
b=("${com_names[@]%.*}") # assign to a new array
$ printf "%s\n" "${b[@]}"
a1
a2
a3
【讨论】:
var=("${ ... [@]%.*}")。另外,尽量不要将名称 test 用于变量,因为它本身就是一个命令!