我想解析文件名并根据它分配一个变量(代码)。我想我可以使用 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