2016-05-22 10 views
0

後で開くファイル名のリストを含むファイルがあります。 変数に行(ファイル名)を読み込んだ後、私が不明な理由でファイルとして後で開くことができません。Bash:別のファイルの中にリストされているファイル名を開く

メインファイルの内容::

first_file.txt 
second_file.txt 

バッシュコマンド:

read line < $main_file # file with the list, received as an argument 
echo $line    # to check that correct filename has been read 
cat $line    # attempt to dump "first_file.txt" contents <- FAILS 
cat first_file.txt  # read "first_file.txt" contents manually 

実行esult:

first_file.txt 
: No such file or directory 
*** this is 1st file's contents *** 
*** .... 
ここ

は私が何をしようとしているの簡単な例であります

したがって、cat first_file.txtの作品、私は明らかにここで何かを誤解

... $lineは "first_file.txt" が含まれますが、cat $lineが失敗し、提案は歓迎しています!

編集: 要求されたように、ここでcat -v $main_fileの出力されます。

first_file.txt^M 
second_file.txt^M 
third_file.txt^M 
^M 
^M 
+1

ソースファイルの行の最後に '\ r'と言ったような隠し文字がありますか?それから、それは正しく印刷されますが、動作しません。 'cat -v main_file'の出力で質問を編集できますか? –

+0

追加情報が追加されました –

答えて

1

^M文字は、キャリッジリターンです(別称、\r)と、多くの場合、Windowsの行末の一部です。彼らはechoのときに表示されませんが、最後にそれを持つテキストでファイルを開くあなたの能力を台無しにしています。

最高の解決策は、「メインファイル」からそれらを削除することです。 dos2unixツールを使用している場合や、sed -i -e 's/\s+$//g' $main_fileのようなGNU sedを使用してその場所で編集し、各行の末尾に余分な空白(^Mを含む)を削除することができます。

+0

あなたは正しいですか?私は、 'line =" $(echo -e "$ {line}" | sed -e 's/^ [[:space:]] * //' -e 'を使って変数から先頭と末尾の空白を削除しました。 s/[[:space:]] * $ // ') "'コマンド、提案された[here](https://stackoverflow.com/questions/369758/how-to-trim-whitespace-from-a-bash -変数)。そして今、それは動作します!ありがとう! –

関連する問題