10

不要な「?」が表示される これをしている間、私のファイル名の最後に:

emplid=$(grep -a "Student ID" "$i".txt  | sed 's/(Student ID:  //g' | sed 's/)Tj//g' ) 
 #gets emplid by doing a grep from some text file
echo "$emplid"   #prints employee id correctly 
cp "$i" "$emplid".pdf  #getting an extra '?' character after emplid and before .pdf

つまり、 123456.pdf のようなファイル名を取得する代わりに、 123456?.pdf を取得します。エコーが正しく印刷されるのに、なぜこれが起こるのですか? 末尾の疑問符文字を削除するにはどうすればよいですか?

4

2 に答える 2

12

あなたのスクリプト ファイルには、UNIX スタイル (\n のみ) ではなく、DOS スタイルの行末 (\r\n) が含まれているようです。この形式のスクリプトでは、\r がコマンドの一部として扱われます。この例では、$emplid に含まれているため、ファイル名に含まれています。

多くのプラットフォームでdos2unixは、ファイルを UNIX スタイルの行末に変換するコマンドがサポートされています。変換後は、UNIX スタイルのテキスト ファイルをサポートするテキスト エディターを使用してください。

編集: 問題の行末はシェル スクリプトにあると想定していましたが、代わりに入力ファイル ("$i".txt) にあるようです。入力ファイルで dos2unix を使用してクリーンアップしたり、スクリプトの sed コマンドにクリーニング ステップを追加したりできます。ところで、sed の 1 つのインスタンスに -e オプションを使用して複数の編集を適用することができます。

emplid=$(grep -a "Student ID" "$i".txt  | sed '-e s/(Student ID:  //g' -e 's/)Tj//g' -e $'s/\r$//' )

使用しないことをお勧めsed 's/.$//'ます -- ファイルが UNIX 形式の場合、ファイル名の最後の文字が切り取られます。

于 2012-11-06T19:45:41.420 に答える
0

file コマンドを使用して、それが純粋な unix であるか、DOS と混合されているかを検出します。

DOS ファイル: ASCII テキスト、CRLF 行末記号付き

Unix ファイルは純粋な ASCII ファイルです。

于 2014-01-30T21:31:12.057 に答える