2017-03-14 39 views
0

我在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 

它可以是在最後一個空行,沒有必要評論。

有人可以解釋爲什麼最後一行不被第一個例子中的正則表達式捕獲嗎?我怎樣才能解決這個問題(除了在文本文件末尾添加空行......)?謝謝

+0

請問您的第一個文件在結尾處斷行? (用'cat -A'測試,檢查行尾標記。)我懷疑它沒有。 –

+1

如果這是問題,解決方案是http://stackoverflow.com/questions/12916352/shell-script-read-missing-last-line:'while read line || [[-n $ line]]' –

+0

哇!就是這樣,你的解決方案完美無缺!非常感謝! – scandel

回答

0

對於while read line; do ... ; done您的文件需要以換行符結束。

嘗試:

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

+3

[不要用'for for'讀取行](http://mywiki.wooledge.org/DontReadLinesWithFor)。 –

+0

謝謝,你的權利...即時編輯我的文章... – beliy

+0

但是,如果它不以換行符結束,你仍然不讀最後一行,所以你需要'while IFS = read -r line | | [[-n $ line]];做' –

相關問題