web-dev-qa-db-ja.com

ファイルからではなく、変数からのみ改行(^ M)を削除する方法

ファイルを変数に読み込んでいますが、問題はファイルが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を使用しましたが、機能しませんでした。これで私の質問が明確になることを願っています。ありがとう

7
rataplan

^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 
7
jlliagre

使用(短い文字列の場合):

${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が必要になることがあります。

4
Isaac

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(同時にインストールされます)に変換されます。

0
Hannu