ファイルを変数に読み込んでいますが、問題はファイルがWindowsでフォーマットされていることです。そのため、改行ではなく^M
が表示されます。
値が変数にある場合、どのように変更しますか? VIでソースを変更できることを知っています(ところで、私はOS Xを使用しています)が、元のファイルを変更することはできず、読み取るだけなので、変数から^M
を削除する必要があります。
私の理解では、\n
は^M
と同じではないため、tr
コマンドは機能しません。
編集
質問は明確ではないようです。これは明確化です。
私はファイルを1行ずつ解析します。各行には、タブで区切られた2つの値があり、各行の終わりには^ Mがあり、次のようになります。
value1 value2^M
value3 value4^M
value5 value6^M
value7 value8^M
私のワークフローは非常に単純明快です。txtファイルには上記の内容が含まれており、ループの個別のフィールドと各行の値が取得されます。 2番目の値を出力すると、^ Mが削除されます。
while IFS=$'\t' read -r -a line
do
Type1="${line[0]}"
Type2="${line[1]}"
done < $TXTFILE
つまり、Type1を印刷するときは問題ありませんが、Type2変数には^ Mが含まれます。私はtr
を使用しましたが、機能しませんでした。変数の最後の文字を削除するためにsed
を使用しましたが、機能しませんでした。これで私の質問が明確になることを願っています。ありがとう
^M
はキャリッジリターン(CR)で、tr
の場合は\r
として、または$'…'
内で指定できます。 \n
は、^J
である改行(LF)を指定します。 Unixの行末はLFで、Windowsの行区切りは2文字のシーケンスCR-LFであるため、LinuxやmacOSなどのUnixシステムで表示されるWindowsテキストファイルは、末尾に^M
があるように見えます最後の改行が欠落している最後の行を除く行。
tr
を使用すると、ファイルから改行を削除できます
tr -d '\r' <somefile.txt >somefile.txt.new && mv somefile.txt.new somefile.txt
またはもっと単純にdos2unix
を使用します。
ファイルの変更を回避するために、ファイルを読み取るときに各行をチェックし、行の終わりにあるCRを取り除くことができます。たとえば、read
を使用してタブ区切り値を解析している場合は、最後のフィールドの最後にあるCRを削除します。パラメータ拡張${VAR%$'\r'}
は、VAR
の値から末尾のCRを引いた値を生成し、CRで終わらない場合はVAR
の値を生成します。
while IFS=$'\t' read -r -a line
do
line[$((${#line[@]}-1))]="${line[$((${#line[@]}-1))]%$'\r'}"
Type1="${line[0]}"
Type2="${line[1]}"
done < "$TXTFILE"
スクリプトを修正する最も簡単な方法は次のとおりです。読み取りコマンドの内部フィールド区切り文字として「復帰」を追加するだけです。
while IFS = $ '\ t \ r' read -r -a line do Type1 = "$ {line [0]}" Type2 = "$ {line [1]}" done <$ TXTFILE
使用(短い文字列の場合):
${var//$'\015'}
例:
$ var=$'This is a test of a CR (\r) character'
$ echo "${var//$'\r'}"
This is a test of a CR () character
長い文字列の場合は、sedまたはawkが必要になることがあります。
CR + LFの行末以外にコンテンツマーカーがない "DOS"ファイルのコンテンツを変換する、より一般的に役立つ方法(LinuxのLFのみとは対照的に)。
Ubuntuの場合、最初と1回だけ、
sudo apt install dos2unix
以下に示す使用、ここではod
を使用して出力を確認します
$ dos2unix <$ TXTFILE | od -t x1z -w17 0000000 76 61 6c 75 65 31 20 20 20 20 76 61 6c 75 65 32 0a> value1 value2。< 0000021 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0a> value3 value4。< 0000042 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0a> value5 value6。< 0000063 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0a> value7 value8。< 0000104 $ cat $ TXTFILE | od -t x1z -w18 0000000 76 61 6c 75 65 31 20 20 20 20 76 61 6c 75 65 32 0d 0a> value1 value2 .. < 0000022 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0d 0a> value3 value4 .. < 0000044 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0d 0a> value5 value6。 。< 0000066 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0d 0a> value7 value8 .. < 0000110
これにより、パラメータに応じて、行末だけでなく他の特殊文字もdos2unix
または対応するunix2dos
(同時にインストールされます)に変換されます。