Bash,如何提取grep出现并将它们存储在数组中

时间:2016-05-02 17:51:14

标签: regex bash grep

我有一个grep操作,产生以下结果:

VRHFIN =Ce : [core=Xe4] s2d1f1 VRHFIN =O: s2p4 VRHFIN =C: s2p2 VRHFIN =H: ultrasoft test

目标是在等号(表示化学元素)之后和冒号之前提取部分,并按照出现的顺序将它们推入阵列中。在这种特定情况下,所需的数组将包含

Ce O C H

如何使用正则表达式实现这一目标?提前谢谢。

3 个答案:

答案 0 :(得分:3)

使用GNU grep

的解决方案

我们将其作为测试文件:

$ cat file
VRHFIN =Ce : [core=Xe4] s2d1f1
VRHFIN =O: s2p4
VRHFIN =C: s2p2
VRHFIN =H: ultrasoft test
other irrelevant lines
here.

如果你有运行Linux的GNU grep,那么你可以提取这样的元素名称:

$ grep -oP '(?<==)\w+(?= *:)' file
Ce
O
C
H

您可以将这些名称放入bash数组中,如下所示:

elements=($(grep -oP '(?<==)\w+(?= *:)' file))

-P选项告诉GNU grep使用Perl样式的正则表达式。匹配前(?<==)需要=,匹配后(?= *:)需要冒号。

我们可以通过declare命令验证数组是否正确:

$ declare -p elements
declare -a elements='([0]="Ce" [1]="O" [2]="C" [3]="H")'

不需要GNU grep的解决方案

使用sed可以获得相同的效果:

$ sed -nE 's/.*=([[:alpha:]]+)[[:space:]]*:.*/\1/p' file
Ce
O
C
H

结果可以像以前一样存储在bash数组中:

$ elements2=($(sed -nE 's/.*=([[:alpha:]]+)[[:space:]]*:.*/\1/p' file))
$ declare -p elements2
declare -a elements2='([0]="Ce" [1]="O" [2]="C" [3]="H")'

答案 1 :(得分:1)

您可以使用进程替换从grep输出中提取值并将它们存储在数组中:

#!/bin/bash

arr=()

while IFS=':= ' read -r _ b _; do
   arr+=("$b")
done < <(grep 'pattern' file)

# print array
declare -p arr
# or else
printf "%s\n" "${arr[@]}"

grep 'pattern' file替换为您实际的grep命令。

答案 2 :(得分:1)

简单明了:

nz
  • aArray =() - 将内容标识为数组的元素
  • $() - 以命令
  • 运行内容
  • sed -n - 不要打印
  • s / - 替换
  • ^ - 行首
  • \ w * - 零个或多个单词字符
  • \ s * - 零个以上的空白字符
  • \(\) - 将所有内容存储为\ 1
  • 。* - 匹配任何内容
  • / \ 1 - 用\ 1
  • 的内容替换所有内容
  • p - 打印结果