如何在Shell数组变量上使用sed命令去除路径提取文件名
数组变量上使用sed命令提取文件名
核心目标
- 首要目标:掌握如何在数组变量(而非文件)上使用
sed命令 - 次要目标:从数组元素中移除路径前缀,仅保留文件名
示例数据
path=$(pwd) echo $path >> /home/peter/my_commands array=($path/*.sh) echo "${array[@]}" >> /home/peter/my_commands/func1.sh /home/peter/my_commands/main.sh /home/peter/my_commands/test.sh
期望输出
得到仅含文件名的数组array2,输出结果为:func1.sh main.sh test.sh
需求总结
# 输入数据 array=(/home/peter/my_commands/func1.sh /home/peter/my_commands/main.sh /home/peter/my_commands/test.sh) # 用于转换的sed命令 # 此处填写... # 输出结果 array2=(func1.sh main.sh test.sh)
已尝试的失败命令
# sed -i -e 's.$path..' # array2=$(sed -n '2p' $path) # array2=(($path/*.sh) | sed -i "s.$path..") # array2="$(echo $array | sed -i -e "s.$path..g")" # array2=$(sed -i -e "s./.." <<< "$array") echo "${array2[@]}"
正确实现方法
方法1:sed结合数组遍历处理
要在数组上使用sed,需先将数组元素逐行输出传递给sed,再重新组装为数组:
# 输入数组 array=(/home/peter/my_commands/func1.sh /home/peter/my_commands/main.sh /home/peter/my_commands/test.sh) path="/home/peter/my_commands" # 处理逻辑:逐行输出数组元素→sed替换路径前缀→转为新数组 array2=($(printf "%s\n" "${array[@]}" | sed "s|^$path/||")) # 验证结果 echo "${array2[@]}"
关键说明:
printf "%s\n" "${array[@]}":将数组每个元素单独输出一行,避免空格导致的元素拆分问题sed "s|^$path/||":用|作为分隔符(规避路径中/的冲突),精准替换掉开头的$path/前缀- 用
()将处理后的结果重新封装为数组
方法2:bash内置参数展开(无需sed)
如果仅需提取文件名,bash内置的参数展开语法更高效,无需调用外部命令:
array2=() for item in "${array[@]}"; do array2+=("${item##*/}") done
关键说明:${item##*/}是bash内置语法,会删除变量item中从开头到最后一个/的所有内容,直接得到文件名。
失败命令问题分析
sed -i是用于修改文件的参数,无法处理管道输入或变量,所有带-i的命令均无效echo $array会将数组展开为单行字符串,若元素含空格会被错误拆分,无法正确处理数组结构($path/*.sh) | sed存在语法错误,管道不能直接嵌套在数组赋值的括号内
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

