Regex 为什么这个正则表达式不能捕获文件的最后一行?
我在bash脚本中逐行读取文本文件,目标是捕获变量声明 bash脚本:Regex 为什么这个正则表达式不能捕获文件的最后一行?,regex,bash,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 "$
#!/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"
输出为:
a=1
b=2
但这一次:
# First variable
a=1
# Second variable
b = 2
# Third variable
c=3
# empty line
输出为:
a=1
b=2
c=3
它可以是结尾的空行,不需要注释
有人能解释为什么第一个例子中的正则表达式没有捕捉到最后一行吗?我如何解决这个问题(除了在文本文件末尾添加一个空行…)?感谢在阅读该行时提供
;做完成
您的文件需要换行结束
尝试:
而IFS=read-r行| |[-n“$line”];
第一个文件末尾是否有换行符?(用cat-A测试,检查行尾标记。)我怀疑不是这样。如果这是问题所在,解决方法是:在读取行时| |[[-n$line]]
Wow!就是这样,您的解决方案非常有效!非常感谢你!嗯,它不是我的,我只知道它存在;)更重要的是,你可以问问自己,这作为Bash脚本是否有意义。也许Awk会更灵活更直截了当…谢谢,你说得对。。。我编辑了我的帖子…但是如果最后一行没有换行符,你仍然不会读,所以你需要而IFS=read-r line |[n$line]];执行
…然后从副本中获得准确答案;)是的,你又对了)
a=1
b=2
c=3