bash:对于txt文件中的每一行匹配正则表达式并将其保存到变量数组

时间:2016-08-28 17:58:58

标签: regex bash awk sed scripting

我正在尝试读取文本文件的每一行并在.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,但我的知识要么不是专家级别,因此我无法实现我想要的。有什么见解吗?

1 个答案:

答案 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将被删除。
  • BashFAQ #1
  • 中更详细地描述了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]及以后