33

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

4

4 に答える 4

53

コマンドラインツールを使用できますdos2unix

dos2unix input

または、次のtrコマンドを使用します。

tr -d '\r' <input >output

実際には、次のファイル形式の切り替えを行うことができますvim

方法A:
:e ++ff=dos
:w ++ff=unix
:e!
方法B:
: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
于 2012-07-27T03:05:20.967 に答える
23

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

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

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

于 2012-07-27T03:04:51.273 に答える
10

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

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

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

于 2016-05-08T12:35:01.653 に答える
7

別の方法

awk 1 RS='\r\n' ORS=
  • RecordSeparatorをに設定します\r\n
  • 出力レコード区切り文字を空の文字列に設定します
  • 1は常に真であり、アクションブロックがない場合{print}は使用されます
于 2014-06-04T05:43:56.547 に答える