bash - 如何替换bash中字符串数组的所有子字符串?
问题描述
我试图在没有路径的情况下列出子目录中的所有文件,我只想要文件名和扩展名,但是 Bash 替换不适用于数组中的所有路径,它只适用于第一个元素。
代码:
#!/usr/bin/bash
NAME="$(pwd | grep -o '[^/]*$')"
# ls src -R
PATH="$(ls src/*.{cpp,hpp} 2> /dev/null)"
if [ 0 -eq "${#PATH[@]}" ]; then
echo "The project has no source code file yet."
exit 0
fi
EMPTY=''
for FILE in "${PATH[@]}"; do
echo "${FILE/src\//$EMPTY}"
done
目录树:
FileReader
├── bin
├── make.sh
├── obj
└── src
├── FileReader.cpp
├── FileReader.hpp
└── main.cpp
预期的:
$ bash make.sh
FileReader.cpp
FileReader.hpp
main.cpp
输出:
$ bash make.sh
FileReader.cpp
src/FileReader.hpp
src/main.cpp
解决方案
由于解析ls
不好,我会做类似的事情:
#!/usr/bin/env bash
# If no matching files, globs expand to an empty string instead of the pattern
shopt -s nullglob
declare -i count=0
for file in src/*.[ch]pp; do
count+=1
printf "%s\n" "$(basename "$file")"
done
[[ $count -eq 0 ]] && echo "The project has no source code file yet."
避免文件名中出现有趣字符的问题。basename(1)
从文件名中删除前导目录组件(以及可选的给定扩展名)。
files=( src/*.[ch]pp )
您还可以使用更接近原始方法的方法安全地获取数组中的文件。不过,我肯定会避免调用变量PATH
,因为这与内置变量冲突。
基于数组的版本(这个使用${variable#pattern}
参数扩展语法,从变量值的开头剥离模式的匹配文本):
#!/usr/bin/env bash
shopt -s nullglob
files=( src/*.[ch]pp )
if [[ "${#files[@]}" -eq 0 ]]; then
echo "The project has no source code file yet."
else
printf "%s\n" "${files[@]#*/}"
fi
推荐阅读
- azure-logic-apps - 如何将数组从 ADF 的 Web Activity 发送到 Logic App Webhook?
- python - 试图在熊猫中使用变换,但它给了我一些错误
- database - 用于 url 和相关关键字的 DynamoDB 数据模型
- css - 位置绝对 div 在离开其父容器并进入另一个容器后隐藏
- python - 在 Python 中绘制多类别数据
- javascript - 显示每行项目 3 的列表并在点击时选择项目 - Vue.js
- png - 使用官员和 PNG 修复图形错误?
- amazon-elastic-beanstalk - 在 AWS Linux2 上安装 Letsencrypt 的正确方法是什么?
- stream - cuda 与 cupy 和 tensorRT 的流同步问题
- python - 从多个 numpy 数组创建 xarray - 时间序列