joh*_*ohn 2 regex bash scripting awk sed
我试图读取文本文件的每一行,并提取.tst之前的名称,并将每个匹配项存储到变量数组中。这是txt文件的示例:
someTest.tst (/blah/blah/blah),
someOtherfile.tst (/some/other/blah),
hello.tst (/not/the/same/blah),
hi.tst (/is/this/blah),
Run Code Online (Sandbox Code Playgroud)
字符前的每一行上都有一堆空格。
我想提取以下值并将它们存储在变量数组中:
someTest
someOtherfile
hello
hi
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用sed和awk,但是我对这两者的了解都不是专家级的身份,因此我无法实现自己想要的。有见识吗?
您根本不需要正则表达式。
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
Run Code Online (Sandbox Code Playgroud)
read接受目的地清单;字段(通过在中的字符进行输入拆分确定IFS)在读取时填充到变量中,并且最后一个目的地接收一行上所有剩余的内容(包括空格)。因此,read -r name _将第一个字段放入name,并将输入行上的所有剩余内容放入名为的变量_。[[ $name = *.tst ]] || continue跳过第一个字段不以结尾的所有行.tst。"${name%.tst}"扩展到的内容"$name",并.tst删除后缀(如果存在)。while read; do ...; done <inputfile模式在BashFAQ#1中有更详细的描述。但是,如果要使用正则表达式,则可能如下所示:
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
Run Code Online (Sandbox Code Playgroud)
使用[[ $string =~ $regex ]]求值$regex作为ERE,并且如果它匹配,把匹配的内容成整体BASH_REMATCH[0],并且任何匹配组成BASH_REMATCH[1]和向前。