我正在尝试从文件(output.txt)中读取,从每行中提取文件名中的票号并添加到该行的末尾。
难点在于,票号可能是任何类型的号码,并且有些号码不被视为票号而且没有固定的格式。
但我所知道的是,在门票号码之前,它通常有_
或.
,后面总是_
例如:
示例文件名
patch_SW_9.3.0.SM-10880B1_HW_client_x86_64.jar
patch_SW_9.3.1.LSUFE-583B1_x86_64.jar
patch_SW_9.3.0_PCRF-17717B1_x86_64.jar
patch_SW_9.3.0_REQUEST-6771B1_i86pc.jar
patch_CM_9_ECS-6870B1_i86pc.jar
InstallPackage_SW_9.3.0.SM-10507B1_20150821_sun4u64.jar
patch_FW_9.3.0.1B_x86_64.jar <-- not to extract, 1B is not the ticket number
patch_SW_4.2.1_5B1_x86_64.jar <-- not to extract, 5B1 is not the ticket number
patch_SW_9.3.0.ServicePackB1_x86_64.jar <-- not to extract, ServicePackB1 is not the ticket number
文本文件(output.txt)
/home/mobaxterm/Data/SW/SW9/releases/A/patch_SW_9.3.0.SM-10880B1_HW_client_x86_64.jar,patch_SW_9.3.0.SM-10880B1_HW_client_x86_64.jar,patch
/home/mobaxterm/Data/SW/SW9/releases/B/patch_SW_9.3.1.LSUFE-583B1_x86_64.jar,patch_SW_9.3.1.LSUFE-583B1_x86_64.jar,patch
/home/mobaxterm/Data/SW/SW9/releases/C/patch_SW_9.3.0_PCRF-17717B1_x86_64.jar,patch_SW_9.3.0_PCRF-17717B1_x86_64.jar,patch
/home/mobaxterm/Data/SW/SW9/releases/D/patch_SW_9.3.0_REQUEST-6771B1_i86pc.jar,patch_SW_9.3.0_REQUEST-6771B1_i86pc.jarr,patch
/home/mobaxterm/Data/SW/SW9/releases/E/patch_CM_9_ECS-6870B1_i86pc.jar,patch_CM_9_ECS-6870B1_i86pc.jar,patch
/home/mobaxterm/Data/SW/SW9/releases/F/InstallPackage_SW_9.3.0.SM-10507B1_20150821_sun4u64.jar,InstallPackage_SW_9.3.0.SM-10507B1_20150821_sun4u64.jar,InstallPackage
/home/mobaxterm/Data/SW/SW9/releases/G/build.x86_64/_dist/image/patch_SW_9.3.0.1B_x86_64.jar,patch_SW_9.3.0.1B_x86_64.jar,patch
/home/mobaxterm/Data/SW/SW4/releases/H/build.x86_64/_dist/image/patch_SW_4.2.1_5B1_x86_64.jar,patch_SW_4.2.1_5B1_x86_64.jar,patch
/home/mobaxterm/Data/SW/SW9/releases/I/build.x86_64/_dist/image/patch_SW_9.3.0.ServicePackB1_x86_64.jar,patch_SW_9.3.0.ServicePackB1_x86_64.jar,patch
期望的输出
patch_SW_9.3.0.SM-10880B1_HW_client_x86_64.jar,SM-10880B1
patch_SW_9.3.1.LSUFE-583B1_x86_64.jar,LSUFE-583B1
patch_SW_9.3.0_PCRF-17717B1_x86_64.jar,PCRF-17717B1
patch_SW_9.3.0_REQUEST-6771B1_i86pc.jar,REQUEST-6771B1
patch_CM_9_ECS-6870B1_i86pc.jar,ECS-6870B1
InstallPackage_SW_9.3.0.SM-10507B1_20150821_sun4u64.jar,SM-10507B1
答案 0 :(得分:0)
将语法限制为POSIX,您可以使用expr text : regex
表达式来解析行中的tickets
,然后写出有效票证的每个line
逗号','
和ticket
。例如:
#!/bin/sh
while read line; do
new=$(expr "$line" : "^.*[_.]\([A-Z]*[-][a-zA-Z0-9]*\)_.*$")
[ -n "$new" ] && printf "%s,%s\n" "$line" "$new"
done <"$1"
exit 0
<强>输入强>
$cat dat/ticketno.dat
patch_SW_9.3.0.SM-10880B1_HW_client_x86_64.jar
patch_SW_9.3.1.LSUFE-583B1_x86_64.jar
patch_SW_9.3.0_PCRF-17717B1_x86_64.jar
patch_SW_9.3.0_REQUEST-6771B1_i86pc.jar
patch_CM_9_ECS-6870B1_i86pc.jar
InstallPackage_SW_9.3.0.SM-10507B1_20150821_sun4u64.jar
patch_FW_9.3.0.1B_x86_64.jar <-- not to extract, 1B is not the ticket number
patch_SW_4.2.1_5B1_x86_64.jar <-- not to extract, 5B1 is not the ticket number
patch_SW_9.3.0.ServicePackB1_x86_64.jar <-- not to extract, ServicePackB1 is not the ticket number
<强>输出强>
$ sh ticketno.sh dat/ticketno.dat
patch_SW_9.3.0.SM-10880B1_HW_client_x86_64.jar,SM-10880B1
patch_SW_9.3.1.LSUFE-583B1_x86_64.jar,LSUFE-583B1
patch_SW_9.3.0_PCRF-17717B1_x86_64.jar,PCRF-17717B1
patch_SW_9.3.0_REQUEST-6771B1_i86pc.jar,REQUEST-6771B1
patch_CM_9_ECS-6870B1_i86pc.jar,ECS-6870B1
InstallPackage_SW_9.3.0.SM-10507B1_20150821_sun4u64.jar,SM-10507B1