文件名中的多个分隔符

时间:2018-09-06 07:57:35

标签: bash shell awk separator

我制作了一个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

在编写脚本以提取以下两个名称之后,此文件总结了从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怎么办?

1 个答案:

答案 0 :(得分:0)

如果您仍在使用Awk,则分别循环遍历Shell中的文件是效率低下且浪费的事情。

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

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元字符,因此不需要用反斜杠转义。