文件名中有多个分隔符

问题描述 投票:0回答:1

我已经制作了一个bash脚本,用于从图像上的文件名生成HTML代码。

以下是我的文件名列表示例:

AttributionCodeConfidentiel.png
AttributionCodeConfidentiel_201706.png
AttributionCodeConfidentiel_201707.png
AttributionCodeConfidentiel_201708.png
AttributionCodeConfidentiel_201709.png
AttributionCodeConfidentiel_201710.png
AttributionCodeConfidentiel_201711.png
AttributionCodeConfidentiel_201712.png
AttributionCodeConfidentiel_201801.png
AttributionCodeConfidentiel_201802.png
AttributionCodeConfidentiel_201803.png
AttributionCodeConfidentiel_201804.png
AttributionCodeConfidentiel_201805.png
AttributionCodeConfidentiel_201806.png
AttributionCodeConfidentiel_201807.png
AttributionCodeConfidentiel_201808.png
bis.png
bis.xindd.png
bis.xindd_201706.png
bis.xindd_201801.png
bis.xindd_201802.png
bis.xindd_201803.png
bis.xindd_201804.png
bis.xindd_201805.png
bis.xindd_201806.png
bis.xindd_201807.png
bis.xindd_201808.png
bis_201706.png
bis_201707.png
bis_201708.png
bis_201709.png
bis_201710.png
bis_201711.png
bis_201801.png
bis_201802.png
bis_201803.png
bis_201804.png
bis_201805.png
bis_201806.png
bis_201807.png
bis_201808.png

在我编写脚本以提取以下名称中的2个内容之后,此文件总结了从ls -l中提取的文件名:

  • 那么
  • 日期

这是bash脚本:

for line in $(cat liste) do
nom=$(echo $line |awk -F\_ '{print $1}')
an=$(echo $line |awk -F\_ '{print $2}'|awk -F\. '{print $1}'|cut -c1-4)
moi=$(echo $line |awk -F\_ '{print $2}'|awk -F\. '{print $1}'|cut -c5-6)
echo "<img class=\"filtre $nom\" src=\"test/$line\" alt=\"$an-$moi\" /></div>" >> test
done

但我有一个问题,因为一些文件名有多个“_”分隔符,如OS_02_EDDI_DocDisponible_201711.png和我的awk不能很好地工作。

在这种情况下,我只能提取EDDI_DocDisponible_201711

bash shell awk separator
1个回答
0
投票

如果你正在使用Awk,那么单独循环shell中的文件是低效且浪费的。

注释掉的行是我重构原始脚本的方式,更新后的替换文件显示了一种方法来分割最后一个下划线而不是第一个下划线的文件名。

awk -F_ '{
    #nom=$1
    nom=$0; sub("^" $1 "[ \t]+", "", nom)
    #last=$2
    last=$NF
    sub(/\..*/,"", last);
    an=substr(last, 1, 4)
    moi=substr(last, 5, 2)
    print "<img class=\"filtre " nom "\" src=\"test/" \
        $0 "\" alt=\"" an "-" moi "\" /></div>" }' liste> test

这也消除了浪费的cat(无论如何)don't loop over lines with for和循环内部的低效附加,迫使操作系统打开文件并为你想要写的每一行寻找它的结尾,并且意味着你必须单独确保在你开始之前文件是空的(如果这是你的意图)。更切向,还要注意下划线不是shell元字符,因此不需要使用反斜杠进行转义。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.