使用正则表达式更改模式中的数字

时间:2017-05-18 11:57:18

标签: bash

我处理实验数据,其中文件名使用以下形式的主题和会话进行编码:

sub-01_ses-01_blabla.txt

我经常发现自己使用以下循环遍历主题和会话:

template="sub-01_ses-01_blabla.txt"
for subject in {1..3}; do
    for session in {1..2}; do
    newname=$(echo $template | \
              sed "s/sub-01/sub-$(printf "%02d" $subject)/g" | \
              sed "s/ses-01/ses-$(printf "%02d" $session)/g")
    echo $newname
    done
done

因为以下代码段太冗长而且我必须在不同情况下反复写代码,我正在寻找一种更加惯用且更简单的方法来替换多个数字模板。我对shell不太熟悉,但可以使用任何bash内置函数或GNU工具。

我可以使用简单的正则表达式吗?

THX。

2 个答案:

答案 0 :(得分:0)

使用$template作为printf

的格式字符串
template="sub-%02d_ses-%02d_blabla.txt"
for subject in 1 2 3; do
    for session in 1 2; do
        newname=$(printed "$template" "$subject" "$session")
        echo "$newname"
    done
done

答案 1 :(得分:0)

Awk将是一个很好的候选人,使用i和p作为计数器,_作为分隔符

awk -F\_ '{ for ( i=1;i<=3;i++) for ( p=1;p<=2;p++) print "sub-0"i"_ses-0"p"_"$3 }' <<< "sub-01_ses-01_blabla.txt"