【问题标题】:Bash: How to break a string into array elements according to a delimiterBash:如何根据分隔符将字符串分解为数组元素
【发布时间】:2015-07-13 10:27:02
【问题描述】:

我已经阅读并尝试了有关如何标记此类字符串的不同方法(例如 IFS、AWK、SED):

data|date|token1|token2|process_job.sh Y

我想使用 '|' 对其进行分隔并像这样访问标记化的字符串:

  • arr[0] 期望值为数据
  • arr[1] 预期值为日期
  • arr[2] 期望值为 token1
  • arr[3] 预期值为 token2
  • arr[4] 预期值为 process_job.sh Y

问题:

当我尝试访问 arr[4] 时,我总是得到 process_job.sh 而不是 process_job.sh Y

你们有什么想法吗?非常感谢

【问题讨论】:

    标签: arrays bash shell unix


    【解决方案1】:

    你可以使用read:

    # original string
    s='data|date|token1|token2|process_job.sh Y'
    
    # read into an array using IFS=|
    IFS='|' read -ra arr <<< "$s"
    
    # check array values
    declare -p arr
    declare -a arr='([0]="data" [1]="date" [2]="token1" [3]="token2" [4]="process_job.sh Y")'
    

    【讨论】:

    • 你好@Anubhava 我编辑了我的问题。你的答案是否改变了数组中每个索引的值?抱歉,我是 shell 脚本的新手。只是想澄清一下。
    • 我没有得到你的问题。我的脚本没有更改任何值,它使用标记化字符串来填充数组。 declare -p arr 用于打印数组值。
    【解决方案2】:

    应该这样做:

    s="data|date|token1|token2|process_job.sh Y"
    IFS="|" arr=($s)
    echo "${arr[0]}"
    

    输出:

    data
    

    【讨论】:

    • 这将使IFS 设置为| 在销售中。
    • 是的,当我使用 IFS 时,我存储了以前的值并将其更改回原来的值。无论如何,谢谢你们两个:)
    • 是的,同样的事情我把它放在我的答案下面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    • 1970-01-01
    • 1970-01-01
    • 2012-11-08
    • 2014-02-19
    • 1970-01-01
    • 2023-02-24
    相关资源
    最近更新 更多