我正在尝试读取文本文件的每一行并在.tst之前提取名称,并将每个匹配存储到变量数组中。这是txt文件的一个例子:
someTest.tst (/blah/blah/blah),
someOtherfile.tst (/some/other/blah),
hello.tst (/not/the/same/blah),
hi.tst (/is/this/blah),
字符前面的每一行都有一堆空格。
我想提取以下值并将它们存储在变量数组中:
someTest
someOtherfile
hello
hi
我尝试过使用sed和awk,但我的知识要么不是专家级别,因此我无法实现我想要的。有什么见解吗?
答案 0 :(得分:5)
根本不需要正则表达式。
arr=( )
while read -r name _; do
[[ $name = *.tst ]] || continue # skip lines not containing .tst
arr+=( "${name%.tst}" )
done <input.txt
declare -p arr # print array contents
read
接受目的地列表;字段(通过拆分IFS
中字符的输入确定)在读取时填充到变量中,最后一个目标接收一行(包括空格)上的所有剩余内容。因此,read -r name _
将第一个字段放入name
,将输入行中的所有剩余内容放入名为_
的变量中。[[ $name = *.tst ]] || continue
会跳过第一个字段未在.tst
中结束的所有行。"${name%.tst}"
扩展为"$name"
的内容,如果存在,后缀.tst
将被删除。while read; do ...; done <inputfile
模式
但是,如果想要使用正则表达式,则可能如下所示:
re='^[[:space:]]*([^[:space:]]+)[.]tst[[:space:]]'
arr=( )
while IFS= read -r line; do
[[ $line =~ $re ]] && arr+=( "${BASH_REMATCH[1]}" )
done <input.txt
declare -p arr # print array contents
使用[[ $string =~ $regex ]]
评估$regex
作为ERE,如果匹配,则将匹配的内容全部放入BASH_REMATCH[0]
,将所有匹配组放入BASH_REMATCH[1]
及以后