我试图在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可以是由下划线分隔的一个或多个单词,但它始终位于第一个和最后一个下划线之间。
任何帮助?
答案 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"
}