ファイル以外の変数からのみ改行文字(^ M)を削除する方法

ファイル以外の変数からのみ改行文字(^ M)を削除する方法

ファイルを変数にロードしていますが、問題はファイルがWindowsでフォーマットされているため、改行で^Mはなく改行が表示されることです。

変数の値をどのように変更しますか? VIでソースコードを変更できることを知っていますが(それでも私はOS Xを使用しています)、元のファイルを変更することはできず、読み取ることしかできないので、^M変数から削除する必要があります。

私が知っているのは\n銀とは異なるので、コマンドは機能しません。^Mtr

編集する

質問がはっきりしていないようです。

1行に2つの値をタブで区切り、各行の末尾に^ Mを使用してファイルを1行ずつ分析しました。

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変数の最後の文字を削除しましたが、うまくいきませんでした。これが私の質問を明確にすることを願っています。ありがとう

答え1

^M\rfortrまたはinsideで指定できるキャリッジリターン(CR)$'…'\n改行文字(LF)を指定します。つまり、^JUnix行末はLFで、Windows行区切り文字は2文字のシーケンスCR-LFなので、LinuxやmacOSなどのUnixシステムで表示されるWindowsテキストファイルは次のようになります。^M最後の改行文字が欠落している各行(最後の行を除く)の終わりにあります。

trwithを使用してファイルからキャリッジリターンを削除できます。

tr -d '\r' <somefile.txt >somefile.txt.new && mv somefile.txt.new somefile.txt

またはより簡単にdos2unix

ファイルの変更を防ぐには、ファイルを読み取るときに各行を確認し、行末のCRを削除するだけです。たとえば、タブで区切られた値の解析に使用する場合は、最後のフィールドのread最後にあるCRを削除します。パラメータ拡張は、${VAR%$'\r'}後続のCRを引いた値またはVARCRで終わらない場合に発生する値を生成します。VAR

while IFS=$'\t' read -r -a line
do
    line[$((${#line[@]}-1))]="${line[$((${#line[@]}-1))]%$'\r'}"
    Type1="${line[0]}"
    Type2="${line[1]}"
done < "$TXTFILE"

答え2

これはスクリプトを修正する最も簡単な方法です。読み取りコマンドの内部フィールド区切り文字として「キャリッジリターン」を追加するだけです。

そしてIFS = $ '\ t\アル字型'-r -a 行を読む
する
  タイプ 1 = "${row[0]}"
  2="${row[1]}" と入力してください。
完了< $TXTFILE

答え3

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

${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

CR+LF 行の末尾に加えて、他のコンテンツインジケータを持たない "DOS" ファイルの内容を変換するより一般的に便利な方法です (Linux の LF のみ)。

Ubuntuの場合、最初で唯一の場合は、次のようにします。

sudo apt インストール 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 > 値 1 値 2. <
0000021 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0a >値 3 値 4.<
0000042 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0a >値 5 値 6.<
0000063 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0a > 値 7 値 8. <
0000104

$猫$ TXTFILE od -t x1z -w18 |
0000000 76 61 6c 75 65 31 20 20 20 20 76 61 6c 75 65 32 0d 0a >値 1 値 2..<
0000022 76 61 6c 75 65 33 20 20 20 20 76 61 6c 75 65 34 0d 0a >値 3 値 4..<
0000044 76 61 6c 75 65 35 20 20 20 20 76 61 6c 75 65 36 0d 0a >値 5 値 6..<
0000066 76 61 6c 75 65 37 20 20 20 20 76 61 6c 75 65 38 0d 0a>値7値8..<
0000110

これは、行の終わりだけでなく、パラメータまたはdos2unixそれに対応する項目unix2dos(同時にインストールされている)に応じて他の特殊文字も翻訳します。

関連情報