从bash中的路径中删除后缀和前缀

时间:2017-02-18 15:24:24

标签: bash

我有以下形式的文件路径:

../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

如何将这些结合起来,以便在一个命令中我能够删除两者并仅提取我想要的部分?

7 个答案:

答案 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

这一步删除了前缀和后缀。