如何提取 grep 并切割成 bash 数组

how to extract grep and cut into a bash array

我试过了:

这里是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 都找到了我错过了什么?

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

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

填充数组:

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

您可以使用 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]*'))

或者您可以 trim 填充数组后的数组值:

$ 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