2017-03-14 10 views
0

私はbashスクリプトで行ごとにテキストファイルを読みましたが、目的は変数の宣言をキャッチすることです。この正規表現がファイルの最後の行をキャッチしていないのはなぜですか?

bashスクリプト:

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

出力は次のとおりです:

このテキストファイルで

#!/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" は、ファイルの最後の行であることに注意してください)

a=1 
b=2 

しかし、このいずれかで:

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

出力は次のようになります。

a=1 
b=2 
c=3 

それは終わりに空行ではなく、必要に応じてコメントすることができます。

最後の行は、最初の例では正規表現でcatchedされていない理由を誰かが説明できますか?そして、どうすれば問題を解決できますか?(テキストファイルの最後に空白行を追加することを除いて...)?おかげwhile read line; do ... ; doneあなたのファイルのための

+0

あなたの最初のファイルの最後に改行を持っていますか? ( 'cat -A'でテストし、行末のマーカーを確認してください。)そうではないと思います。 –

+1

これが問題であれば、解決策はhttp://stackoverflow.com/questions/12916352/shell-script-read-missing-last-line: 'while read line || [[-n $ line]] ' –

+0

うわー!これはそれで、あなたのソリューションは完璧に動作します!どうもありがとうございます! – scandel

答えて

0

は改行で終わる必要があります。

試してみてください。

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

+3

[for'で行を読んではいけません](http://mywiki.wooledge.org/DontReadLinesWithFor)。 –

+0

ありがとう、あなたは正しい...私の投稿を編集しました... – beliy

+0

しかし、改行文字で終わっていなければ、まだ最後の行を読んでいないので、 'IFS = read -r line | | [[-n $行]]; do' –

関連する問題