为什么这个正则表达式没有捕获文件的最后一行?

时间:2017-03-14 14:37:05

标签: regex bash

我在bash脚本中逐行读取文本文件,目标是捕获变量声明。

bash脚本:

#!/bin/bash

filePath=$1

while read line
do
    if [[ $line =~ ^[[:blank:]]*([^#[:blank:]]+)[[:blank:]]*=[[:blank:]]*(.*) ]]
    then
        var=${BASH_REMATCH[1]}
        value=${BASH_REMATCH[2]}
        echo "$var=$value"
    fi
done < "$filePath"

使用此文本文件(请注意,“c = 3”行是文件的最后一行):

# First variable
a=1
# Second variable
 b = 2
# Third variable
c=3

输出结果为:

a=1
b=2

但是有了这个:

# First variable
a=1
# Second variable
 b = 2
# Third variable
c=3
# empty line

输出结果为:

a=1
b=2
c=3

最后可能是一个空行,不需要评论。

有人可以解释为什么第一个例子中的正则表达式没有抓住最后一行吗?我该如何解决问题(除了在文本文件的末尾添加一个空行...)?谢谢

1 个答案:

答案 0 :(得分:0)

while read line; do ... ; done您的文件需要以换行符结束。

尝试:

while IFS= read -r line || [ -n "$line" ]; do