2016-06-17 4 views
0

私は、特定のフォーマット(option = valueまたはoption = value1 value2 ...)の設定ファイルからいくつかの設定オプションを取得している小さなスクリプトを書いています。ファイルから読み込み中に特別なシンボルを取り除く

設定ファイル:

SomeOption=asdf 
IFS=HDMI1 HDMI2 VGA1 DP1 
SomeOtherOption=ghjk 

スクリプト:

for VALUE in $(cat settings | grep IFS | sed 's/.*=\(.*\)/\1/'); do 
    echo "$VALUE"x 
done 

今、私は次のような出力が得られます。

HDMI1x 
HDMI2x 
VGA1x 
xP1 

予想される出力:

HDMI1x 
HDMI2x 
VGA1x 
DP1x 

私は明らかにこのようなデータを使用することはできません。何が起こっているのですか?

よろしく

+0

期待される出力は? – anishsane

+0

何が特別なキャラクターですか?ファイルを 'cat -v'できますか? – 123

+0

'cat -v'は各行の後に'^M'シンボルを表示します。 – cronotk

答えて

0

一般的に、あなたは、このようawkを使用することができます。

awk -F'[= ]' '$1=="IFS"{for(i=2;i<=NF;i++)print $i"x"}' settings 

=またはスペースで行を分割し-F'[= ]。次のawkプログラムは、最初のフィールドが変数名IFSに等しいかどうかをチェックし、トラフカラム2を最後まで繰り返して出力します。

しかし、コメントではファイルがWindowsの行末を使用していると言いました。この場合、awkを使用する前にファイルを前処理する必要があります。あなたは、改行記号を削除するためにtrを使用することができます。

tr -d '\r' settings | awk -F'[= ]' '$1=="IFS"{for(i=2;i<=NF;i++)print $i"x"}' 
0

理由は、あなたの設定ファイルはDOSの行末を使用している可能性があります。

あなたは(例えばdos2unixで)、あなたのループは、2つのユーティリティの呼び出しを削除し、次のように変更することができることを修正したら:

for value in $(sed -n -e 's/^IFS.*=\(.*\)/\1/p' settings); do 
    echo "$value"x 
done 

それとも、削除、一度にそれをすべて行うことができます設定ファイルをまったく変更する必要はありません:

tr -d '\r' <settings | 
for value in $(sed -n -e 's/^IFS.*=\(.*\)/\1/p'); do 
    echo "$value"x 
done 
関連する問題