我有一个grep操作,产生以下结果:
VRHFIN =Ce : [core=Xe4] s2d1f1
VRHFIN =O: s2p4
VRHFIN =C: s2p2
VRHFIN =H: ultrasoft test
目标是在等号(表示化学元素)之后和冒号之前提取部分,并按照出现的顺序将它们推入阵列中。在这种特定情况下,所需的数组将包含
Ce O C H
如何使用正则表达式实现这一目标?提前谢谢。
答案 0 :(得分:3)
我们将其作为测试文件:
$ 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")'
使用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