【问题标题】:How can I parse/capture strings separated by dashes?如何解析/捕获由破折号分隔的字符串?
【发布时间】:2016-06-29 00:02:02
【问题描述】:

在 Bash shell 脚本中,我正在处理这样开始的数据:

string1-string2-string3-string4-etc

我需要将string1string2 分配给唯一变量,并将string3-string4-etc 一起留在另一个唯一变量中。我尝试设置 IFS,但随后 string3string4etc 断开连接。

我怎样才能得到我想要的数据?如果可能的话,我更喜欢内置的 shell 命令,但 gawk 或其他工具也可以。

【问题讨论】:

    标签: string bash parsing field variable-assignment


    【解决方案1】:

    使用剪切和命令替换来捕获字段

    只要- 字符始终是字段分隔符并且不嵌入任何子字符串中,以下将起作用:

    str='string1-string2-string3-string4-etc'
    a=$(echo "$str" | cut -d- -f1)
    b=$(echo "$str" | cut -d- -f2)
    c=$(echo "$str" | cut -d- -f3-)
    

    cut 实用程序使用破折号作为分隔符来定义要捕获的字段,而 Bash command substitution 用于将 cut 的输出分配给变量。

    验证

    $ echo "$a"; echo "$b"; echo "$c"
    string1
    string2
    string3-string4-etc
    

    【讨论】:

    • 您正在为要提取的每个组件创建至少三个额外的进程表条目(运行echo 的子shell、cut 的副本和命令替换shell)方式 - 与让您已经运行的 shell 执行进程中的工作相比,效率非常低。
    【解决方案2】:

    使用内置的read 命令:

    str='string1-string2-string3-string4-etc'
    IFS=- read str1 str2 the_rest <<< "$str"
    

    【讨论】:

    • 感谢您的所有回答!我选择这个作为答案是因为它使用内置的 shell 命令并且似乎是捕获数据的最有效方式。
    • @Gregg ,那么您应该通过单击答案左侧的勾号将答案标记为已接受...
    【解决方案3】:

    使用 Bash 正则表达式:

    s=string1-string2-string3-string4-etc
    pat="([^-]*)-([^-]*)-(.*)"
    [[ $s =~ $pat ]]
    echo "${BASH_REMATCH[1]}"
    echo "${BASH_REMATCH[2]}"
    echo "${BASH_REMATCH[3]}"
    

    输出:

    string1
    string2
    string3-string4-etc
    

    【讨论】:

    • 这对于对于基于read的简单拆分来说过于复杂的情况非常有用。
    • 同意。而且我不知道 BASH_REMATCH。现在用它来做一些不同的事情。谢谢你的回答!
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2012-01-20
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 2012-05-12
    • 1970-01-01
    相关资源
    最近更新 更多