代码之家  ›  专栏  ›  技术社区  ›  Jas

如何提取grep并切入bash数组

  •  2
  • Jas  · 技术社区  · 9 年前

    我尝试了:

    这是file.txt的内容

    some other text
    #1.something1=kjfk
    #2.something2=dfkjdk
    #3.something3=3232
    some other text
    

    bash脚本:

    ids=( `grep "something" file.txt | cut -d'.' -f1` )
    
    for id in "${ids[@]}"; do
      echo $id
    done
    

    结果:

    (nothing newline...)
    (nothing newline...)
    (nothing newline...)
    

    但它所打印的一切都与每一个这样的id的换行符完全不同?

    2 回复  |  直到 9 年前
        1
  •  1
  •   anubhava    9 年前

    你的 grep cut 应该可以工作,但您可以使用 awk 并将2个命令缩减为一个:

    while read -r id;
       echo "$id"
    done < <(awk -F '\\.' '/something/{print $1}' file.txt)
    

    要填充阵列,请执行以下操作:

    ids=()
    while read -r id;
       ids+=( "$id" )
    done < <(awk -F '\\.' '/something/{print $1}' file.txt)
    
        2
  •  1
  •   ghoti    9 年前

    您可以使用 grep -o 选项仅输出正则表达式匹配的文本:

    $ ids=($(grep -Eo '^#[0-9]+' file.txt))
    $ echo ${ids[@]}
    #1 #2 #3
    

    这当然不会检查线路上是否存在周期。。。如果这很重要,那么您可以使用另一个管道展开:

    $ ids=($(grep -Eo '^#[0-9]+\.something' file.txt | grep -o '^#[0-9]*'))
    

    或者可以在填充数组后修剪数组值:

    $ ids=($(grep -Eo '^#[0-9]+\.something' file.txt))
    $ echo ${ids[@]}
    #1.something #2.something #3.something
    $ for key in "${!ids[@]}"; do ids[key]="${ids[key]%.*}"; done
    $ echo ${ids[@]}
    #1 #2 #3