拆分文件名并获取下划线第一次和最后一次出现之间的元素

时间:2017-02-21 11:42:48

标签: bash for-loop split substring

我试图在for循环中拆分许多文件夹名称,并在文件名的第一个和最后一个下划线之间提取元素。文件名可以看起来像ENCSR000AMA_HepG2_CTCF或ENCSR000ALA_endothelial_cell_of_umbilical_vein_CTCF。

我的问题是文件夹名称在下划线总数方面彼此不同,所以我不能使用以下内容:

IN=$d
folderIN=(${IN//_/ })
tf_name=${folderIN[-1]%/*} #get last element which is the TF name
cell_line=${folderIN[-2]%/*}; #get second last element which is the cell line
dataset_name=${folderIN[0]%/*}; #get first element which is the dataset name

cell_line可以是由下划线分隔的一个或多个单词,但它始终位于第一个和最后一个下划线之间。

任何帮助?

2 个答案:

答案 0 :(得分:0)

只需在两步bash参数扩展 ONLY 中执行此操作,因为bash不支持嵌套参数扩展,而不像zsh或其他shell。

"${string%_*}"在最后一次出现' _'之后删除所有内容并"${tempString#*_}"删除从开始到第一次出现的所有内容' _'

string="ENCSR000ALA_endothelial_cell_of_umbilical_vein_CTCF"
tempString="${string%_*}"
printf "%s\n" "${tempString#*_}"
endothelial_cell_of_umbilical_vein

另一个例子,

string="ENCSR000AMA_HepG2_CTCF"
tempString="${string%_*}"
printf "%s\n" "${tempString#*_}"
HepG2

您可以修改此逻辑以应用于文件夹中的每个文件名。

答案 1 :(得分:0)

可以使用正则表达式。

extract_words() {
    [[ "$1" =~ ^([^_]+)_(.*)_([^_]+)$ ]] && echo "${BASH_REMATCH[2]}"
}

while read -r from_line
do
    extracted=$(extract_words "$from_line")
    echo "$from_line" "[$extracted]"
done < list_of_filenames.txt
编辑:我将“提取”移动到一个单独的bash函数中,以便在更复杂的情况下重用和轻松修改,例如:

extract_words() {
        perl -lnE 'say $2 if /^([^_]+)_(.*)_([^_]+)$/' <<< "$1"
}