web-dev-qa-db-ja.com

LinuxでのWindows改行の削除(sedとawk)

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を不適切に使用していますか、または制限がありますか?

29
kermatt

sedの一部のバージョンは\rを文字として認識しません。ただし、bash機能を使用してその制限を回避できます。

echo $string | sed $'s/\r//'

ここでは、bashをコマンドとしてsedに渡す前に、$'...'構造内の実際のキャリッジリターン文字で '\ r'を置き換えます。 (bashを使用すると仮定すると、他のシェルにも同様の構造が必要です。)

20
chepner

コマンドラインツール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
39
kev

別の方法

awk 1 RS='\r\n' ORS=
  • record Separatorを\r\nに設定します
  • 出力レコード区切り文字を空の文字列に設定します
  • 1は常にtrueであり、アクションブロックがない場合は{print}が使用されます
6
Steven Penny

sed -e 's/\r//g' input_file

これは私のために動作します。 -iコマンドの代わりに-eの違い。

また、プラットフォームごとに動作が異なることを説明しました。私は:sed --version This is not GNU sed version 4.0

4
Sergiy Dolnyy