【问题标题】:How to extract values from a string on ksh (korn shell)如何从 ksh (korn shell) 上的字符串中提取值
【发布时间】:2012-05-09 03:07:03
【问题描述】:

我有以下输入

  1. MyComposite[2.1],partition=default,mode=active,state=on,isDefault=true,deployedTime=2012-05-07T15:35:22.473-07:00
  2. MessageManager[1.0],partition=default,mode=active,state=on,isDefault=true,deployedTime=2012-05-07T15:37:14.137-07:00
  3. SimpleApproval[1.0],partition=default,mode=active,state=on,isDefault=true,deployedTime=2012-05-07T15:28:39.599-07:00

我有一个脚本可以逐行解析文件中的输入,但我不知道如何将每行中的单个参数提取到局部变量中,以便执行其他过程

到目前为止,我正在尝试以下方法:

#!/bin/ksh

file="output"

compositeName="foo" ci=0
# while loop while read line do
        # display line or do somthing on $line
        if echo "$line" | egrep -q '\[[0-9]*\.[0-9]*\].*?(mode=active).*?
           (state=on)'  then compositeName=$( echo "$line" | egrep '[0-9]*' ) 
        echo "$compositeName" 
               #echo "$line"
        fi
         done <"$file"

我很想从这个字符串中只提取两个值,第一个单词和括号之间的浮点数

即:

name = MyComposite 版本 = 2.1

有什么想法吗?

【问题讨论】:

    标签: shell ksh


    【解决方案1】:

    我不确定这些行号是否在文件中。如果没有,您可以这样做:

    #!/usr/bin/env ksh
    
    while IFS="," read nameVersion line; do
      name="${nameVersion%%\[*}"
      version="${nameVersion//*\[+([0-9.])\]*/\1}"
      print "name=$name version=$version"
    done < "$file"
    

    如果文件中的行号,则将上述脚本中的名称赋值改为name="${nameVersion//+([0-9]).+( )+(*)\[*/\3}"

    【讨论】:

    • 是的,这些行号在文件中并且不连续。现在我需要使用 egrep 验证与格式匹配的每一行,因为文件中的许多行都是无用的,你认为我可以跳过你的方法不符合格式的行吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多