ファイルを変数にロードしていますが、問題はファイルがWindowsでフォーマットされているため、改行で^M
はなく改行が表示されることです。
変数の値をどのように変更しますか? VIでソースコードを変更できることを知っていますが(それでも私はOS Xを使用しています)、元のファイルを変更することはできず、読み取ることしかできないので、^M
変数から削除する必要があります。
私が知っているのは\n
銀とは異なるので、コマンドは機能しません。^M
tr
編集する
質問がはっきりしていないようです。
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
\r
fortr
またはinsideで指定できるキャリッジリターン(CR)$'…'
。\n
改行文字(LF)を指定します。つまり、^J
Unix行末はLFで、Windows行区切り文字は2文字のシーケンスCR-LFなので、LinuxやmacOSなどのUnixシステムで表示されるWindowsテキストファイルは次のようになります。^M
最後の改行文字が欠落している各行(最後の行を除く)の終わりにあります。
tr
withを使用してファイルからキャリッジリターンを削除できます。
tr -d '\r' <somefile.txt >somefile.txt.new && mv somefile.txt.new somefile.txt
またはより簡単にdos2unix
。
ファイルの変更を防ぐには、ファイルを読み取るときに各行を確認し、行末のCRを削除するだけです。たとえば、タブで区切られた値の解析に使用する場合は、最後のフィールドのread
最後にあるCRを削除します。パラメータ拡張は、${VAR%$'\r'}
後続のCRを引いた値またはVAR
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"