壳牌 - 阅读文件&从每个线路中提取票证ID&添加到行尾

时间:2015-10-22 08:50:18

标签: shell unix

我正在尝试从文件(output.txt)中读取,从每行中提取文件名中的票号并添加到该行的末尾。

难点在于,票号可能是任何类型的号码,并且有些号码不被视为票号而且没有固定的格式。

但我所知道的是,在门票号码之前,它通常有_.,后面总是_

例如:

  1. SM-10880B1
  2. LSUFE-583B1
  3. PCRF-17717B1
  4. REQUEST-6771B1
  5. SM-10507B1
  6. ECS-6870B1
  7. 示例文件名

        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
    

1 个答案:

答案 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