文件名解析器

文件名解析器

我想解析文件名并根据它分配一个变量(代码)。我想我可以使用 cut 来获取每个值。但是我们可以用一个命令来完成它吗?

样本文件名:012345678_012345678-abcdefghijklmnop_YYYYMMDD_TTTT

从第二轮预选赛开始012345678我需要为变量(代码)分配一个值。

如果 col-2 和 col-3 是 yy 并且 col-4 和 col-5 是 00 或 01 或 02 并且 col 678 是 'abc' 分配代码 = usa

如果 col-2 和 col-3 是 yy 并且 col-4 和 col-5 是 00 或 01 或 02 并且 col 678 不等于 'abc' 分配代码 = uk

如果 col-2 & col-3 不等于 yy 并且 col-4 & col-5 不等于 00 或 01 或 02 并且 col 678 不等于 'abc' 指定代码 = Aus

笔记:第二个限定符始终位于第一个下划线之后、第一个破折号之前。 yy 是位置 col -2 和 col-3 的第二个限定符中的值

示例文件名:012345678_01yy00abc-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 分配代码 = usa

文件名示例:012345678_01yy00xyz-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 分配代码 = uk

示例文件名:012345678_01aa98def-xxxxxxxxxxxxxxxxxxxxx_20180408_1300 分配代码 = Aus(因此,如果不是 usa 或 uk,则为 Aus)

答案1

以下 bash 脚本循环遍历当前目录中与模式 (something) underscore (something) dash (something) underscore (something) underscore (something) 匹配的所有文件,然后挑选相关字段进行比较。该语法的意思是获取从位置 4 开始${field:4:2}的值并提取两个字符。$field

然后根据您列出的逻辑比较各个部分,并code分配变量。

#!/bin/bash

for f in *_*-*_*_*
do
  field=${f#*_}
  field=${field%%-*}

  col23=${field:2:2}
  col45=${field:4:2}
  col678=${field:6:3}

  if [ "$col23" = "yy" ]
  then
    case $col45 in
      (00|01|02)
        if [ "$col678" = "abc" ]
        then
                code=usa
        else
                code=uk
        fi
        ;;
      (*)
        code=Aus
        ;;
    esac
  else
    code=Aus
  fi
  echo "For file $f, code is: $code"
done

答案2

只需一个正则表达式即可给出所有字段。
只需一个 case 语句即可测试所有条件:

#!/bin/bash

a='[^_]+_'    b='[^-]{2}'    c='[^-]{3}'
regex="^$a($b($b)($b)($c))-$a$a.*$"

for f in *_*-*_*_*; do
    if [[ $f =~ $regex ]]; then

        arr=("${BASH_REMATCH[@]:1}")
        # echo "field=${arr[0]} col23=${arr[1]} col45=${arr[2]} col678=${arr[3]}"

        a=0; b=0; c=0
        [[ ${arr[1]} == "yy"        ]] && a=1
        [[ ${arr[2]} == @(00|01|02) ]] && b=1
        [[ ${arr[3]} == "abc"       ]] && c=1
        case $a$b$c in
            (111) code=usa ;;
            (110) code=uk  ;;
            (*)   code=Aus ;;
        esac
        echo "For file $f, code is: $code"
    fi
done

相关内容