我有以下形式的文件路径:
../healthy_data/F35_HC_532d.dat
我想从中提取F35_HC_532d
。我可以在bash中删除此文件名中的前缀和后缀:
for i in ../healthy_data/*; do echo ${i#../healthy_data/}; done # REMOVES PREFIX
for i in ../healthy_data/*; do echo ${i%.dat}; done # REMOVES SUFFIX
如何将这些结合起来,以便在一个命令中我能够删除两者并仅提取我想要的部分?
答案 0 :(得分:5)
您可以像这样使用BASH正则表达式并打印捕获的组#1:
for file in ../healthy_data/*; do
[[ $file =~ .*/([_[:alnum:]]+)\.dat$ ]] && echo "${BASH_REMATCH[1]}"
done
答案 1 :(得分:1)
如果你可以使用Awk
,那很简单,
for i in ../healthy_data/*
do
stringNeeded=$(awk -F/ '{split($NF,temp,"."); print temp[1]}' <<<"$i")
printf "%s\n" "$stringNeeded"
done
-F/
将输入字符串拆分为/
字符,$NF
表示字符串中的最后一个字段F35_HC_532d.dat
,现在是split()
使用去限制器.
调用函数以在dot
之前提取部件。
上述Awk
中的选项/功能与POSIX
兼容。
此外bash
不支持嵌套参数扩展,您需要按以下两个步骤进行修改: -
tempString="${i#*/*/}"
echo "${tempString%.dat}"
在单循环中,
for i in ../healthy_data/*; do tempString="${i#*/*/}"; echo "${tempString%.dat}" ; done
这里的双重语法,"${i#*/*/}"
部分只将F35_HC_532d.dat
存储到变量tempString
中,在该变量中我们将.dat
部分移除为"${tempString%.dat}"
}
答案 2 :(得分:0)
你认为这是一步吗?
for i in ../healthy_data/*; do
sed 's#\.[^.]*##'<<< "${i##*/}"
done
答案 3 :(得分:0)
如果所有文件以.dat
结尾(如您所确认),则可以使用basename
命令:
basename -s .dat /path/to/files/*
如果许多(!)这些文件,请使用find
以避免参数列表过长错误:
find /path/to/files -maxdepth 1 -name '*.dat' -exec basename -s .dat {} +
对于需要处理的shell脚本,如果任意数量的.dat
文件使用第二个命令!
答案 4 :(得分:0)
您无法在单个参数扩展中删除前缀和后缀。
但是,这可以仅使用参数扩展操作在单个循环中完成。只需将前缀剥离扩展保存到变量并再次使用扩展来删除其后缀:
for file in ../healthy_data/*; do
prefix_stripped="${file##*\/healthy_data\/}"
echo "${prefix_stripped%.dat}"
done
答案 5 :(得分:0)
通用前缀/后缀删除:
您的具体示例:
for i in ../healthy_data/*; do j=${i#../healthy_data/}; echo ${j%.dat} done
答案 6 :(得分:0)
如果您使用的是zsh
,则无需定义另一个变量即可实现此目标的一种方法是
for i in ../healthy_data/*; do echo "${${i#../healthy_data/}%.dat}"; done
这一步删除了前缀和后缀。