ファイル以外の変数からのみ改行文字(^ 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"

おすすめ記事