【问题标题】:Regex or split in python for shell awk equivalent正则表达式或在 python 中拆分为 shell awk 等价物
【发布时间】:2018-07-08 07:53:39
【问题描述】:

我有一个代理版本文件,我需要对其进行解析以获取应用程序版本详细信息。 版本文件/opt/app_folder/agent_version.txt的(示例)内容如下:

Version: 10.2.4.110
Pkg name: XXXX-10.2.4-Agent-Linux-x86_64
Revision: 110
Patch version: 23

我需要输出为来自Version 的前三个数字和来自Release version 的数字。 例如:

Current Version: 10.2.4.23

所以,我使用下面的代码在 shell 中使用 awk 实现这一目标

FILE=/opt/app_folder/agent_version.txt

my_ver=`awk -F[:.] '/Version/ {gsub(" ",""); print $2"."$3"."$4}' ${FILE}`
            OR
my_ver=`awk -F[-] '/Pkg/ {print $2}' ${FILE}`

my_patch=`awk -F[:.] '/version/ {gsub(" ",""); print $NF}' ${FILE}`
my_cur_ver="$my_ver.$my_patch"

echo $my_cur_ver
10.2.4.23

如何在 Python 中实现此结果?使用正则表达式或拆分或两者的组合?

我在RHEL 6.2 x86_64上使用Python 3.3

【问题讨论】:

  • 您应该包括使用regex/split 解决问题的 Python 努力...因为那是您的问题陈述.. bash/awk 解决方案只是额外信息..
  • @talz 从他问这个问题到现在才一个小时 - 至少给这个家伙几个小时,看看他得到什么答案,然后再选择一个!
  • @Sundeep ,我没有尝试太多......几乎到了“一点也不”的地步,因为我是 python 中的“非常” Noobie,不知道如何继续: )

标签: python regex bash awk split


【解决方案1】:

关注awk 可能对您有所帮助。

awk '/Version/{split($NF,a,".");next} /Patch version/{print a[1],a[2],a[3],$NF}' OFS="."  Input_file

输出如下。

10.2.4.23

【讨论】:

  • @Sundeep,awk 被标记为有问题,请告诉我,否则我将删除我的解决方案。
  • @RavinderSingh13 ,它会直接在 Python 上工作吗?使用子进程或其他东西......你能详细说明你的命令吗?
  • @Marcos,是的,我们可以用 Python 调用它。让我现在也为代码添加解释。
【解决方案2】:

或将其解析为字典并检索所需的部分:

txt = """Version: 10.2.4.110
Pkg name: XXXX-10.2.4-Agent-Linux-x86_64
Revision: 110
Patch version: 23"""  

# with open("yourfile.txt") as f: 
#     txt = f.read()

dic = {}
for l in txt.splitlines():   # split the blob into lines
    k,v = l.split(":",2)     # split at first : produce 2 items max
    dic.setdefault( k.strip(),v.strip().split("."))  # add to dict & split at . into list

v =  '.'.join(dic["Version"][:-1]+dic["Patch version"] ) # join correct things together 

print(v)

输出:

10.2.4.23

总体来说有点浪费,但可以在没有正则表达式的情况下使用。

为了完整起见:dic 看起来像这样:

{'Revision': ['110'], 
 'Patch version': ['23'], 
 'Version': ['10', '2', '4', '110'], 
 'Pkg name': ['XXXX-10', '2', '4-Agent-Linux-x86_64']}

【讨论】:

  • 为使用 dict 添加了 +1,我更喜欢使用正则表达式
【解决方案3】:

假设txt 包含文件的内容,这将为您提供版本:

import re
version = re.findall("Version:\s+((?:\d+\.){3})", txt)[0] + re.findall("Patch version:\s+(\d+)", txt)[0]

或者如果你更喜欢只有一个正则表达式:

version = ''.join(re.findall("Version:\s+((?:\d+\.){3}).*Patch version:\s+(\d+)", txt, re.DOTALL)[0])

【讨论】:

    【解决方案4】:

    正则表达式(?:Version:\s?((?:\d+\.){3})(?:[^\r\n]+\r?\n){3}Patch version:\s?(\d+))

    替换$1$2

    Match 1
    ....
    Group 1.    9-16    `10.2.4.`
    Group 2.    90-92   `23`
    

    输出

    10.2.4.23
    

    Regex demo

    import re
    
    text = 'Version: 10.2.4.110\r\nPkg name: XXXX-10.2.4-Agent-Linux-x86_64\r\nRevision: 110\r\nPatch version: 23'
    
    replaced = re.sub(r'(?:Version:\s?((?:\d+\.){3})(?:[^\r\n]+\r?\n){3}Patch version:\s?(\d+))', '\g<1>\g<2>', text)
    print(replaced) //10.2.4.23
    

    【讨论】:

    • 我们真的需要在正则表达式中使用 \r\n 而不是 \n,因为我&#39;将只在 Linux 主机上运行代码...从不在 Windows 上...正则表达式不需要似乎无法在我的 Linux 主机上运行
    猜你喜欢
    • 2015-10-28
    • 2021-10-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 2012-06-19
    相关资源
    最近更新 更多