Vimで^ Mとして表示される(行末ではなく)フィールドの中央に改行文字が不適切に配置された区切りファイルがいくつかあります。これらは、MSSQLデータベースのfreebcp(Centos 6)エクスポートから発生します。データを16進数でダンプすると、\ r\nパターンが表示されます。
$ xxd test.txt | grep 0d0a
0000190: 3932 3139 322d 3239 3836 0d0a 0d0a 7c43
私はawkでそれらを削除できますが、sedで同じことを行うことはできません。
これはawkで機能し、改行を完全に削除します。
awk 'gsub(/\r/,""){printf $0;next}{print}'
ただし、これはsedでは行われず、改行がそのまま残ります。
sed -i 's/\r//g'
これは効果がないように見えます:
sed -i 's/\r\n//g'
Sed式(ctrl + v、ctrl + m)で^ Mを使用しても機能しないようです。
この種のタスクでは、sedは簡単に理解できますが、私は両方の詳細を学んでいます。 sedを不適切に使用していますか、または制限がありますか?
sed
の一部のバージョンは\r
を文字として認識しません。ただし、bash
機能を使用してその制限を回避できます。
echo $string | sed $'s/\r//'
ここでは、bash
をコマンドとしてsed
に渡す前に、$'...'
構造内の実際のキャリッジリターン文字で '\ r'を置き換えます。 (bash
を使用すると仮定すると、他のシェルにも同様の構造が必要です。)
コマンドラインツールdos2unix
を使用できます
dos2unix input
または、tr
コマンドを使用します。
tr -d '\r' <input >output
実際、vim
でファイル形式の切り替えを行うことができます。
:e ++ff=dos
:w ++ff=unix
:e!
:e ++ff=dos
:set ff=unix
:w
ファイル内の\r\n
シーケンスを削除する場合は、vim
で次のコマンドを試してください。
:e ++ff=unix " <-- make sure open with UNIX format
:%s/\r\n//g " <-- remove all \r\n
:w " <-- save file
awk
ソリューションは正常に機能します。別の2つのsed
ソリューション:
sed '1h;1!H;$!d;${g;s/\r\n//g}' input
sed ':A;/\r$/{N;bA};s/\r\n//g' input
別の方法
awk 1 RS='\r\n' ORS=
\r\n
に設定します1
は常にtrueであり、アクションブロックがない場合は{print}
が使用されますsed -e 's/\r//g' input_file
これは私のために動作します。 -iコマンドの代わりに-eの違い。
また、プラットフォームごとに動作が異なることを説明しました。私は:sed --version This is not GNU sed version 4.0