すべての改行の前に改行を追加する方法は?


28

改行のみに使用するファイルがありますが、改行ごと\nに必要\r\nです。これどうやってするの?

たとえば、Vimでを使用して解決しました:%s/\n/\r\n/gが、スクリプトまたはコマンドラインアプリケーションを使用したいと思います。助言がありますか?

sedまたはgrepで調べてみましたが、エスケープシーケンスの回避策にすぐに混乱しました(これらのコマンドは少し緑です)。

興味がある場合、アプリケーションは私の質問/回答に関連しています

回答:


36

unix2dos(Debianにあります)を使用できます:

unix2dos file

この実装は挿入されないことに注意してくださいCRすべての前にLFのみ前に、LFすでに1つだけが先行していないのCRとバイナリファイルをスキップします(0x0の中でバイト値を含むものは- >が0x1F以外の範囲LFFFTABまたはCR)。

または使用sed

CR=$(printf '\r')
sed "s/\$/$CR/" file

または使用awk

awk '{printf "%s\r\n", $0}' file

または使用perl

perl -pe 's|\n|\r\n|' file

unix2doxすべての LFのCR aを挿入しないことに注意してください。1つ(そして1つだけ)のCRがまだ先行していないLFの前にのみです。
ステファンシャゼル14

@StéphaneChazelas:ポイントをありがとう、私の答えに追加しました。
cuonglm

1
ここで私にとって重要な情報は、'\r'with sedthe trick を使用することでした。
rkersh

8

これはまさにunix2dosそうです:

$ unix2dos file.txt

これによりfile.txt、インプレースがCRLF行末のバージョンに置き換えられます。

でそれをしたい場合sedは、すべての行の最後に改行を挿入できます。

sed -e 's/$/\r/' file.txt

これsにより、行末($)の直前のゼロサイズ領域が()に置き換えられ\rます。インプレース置換を行うには(そうするようにunix2dos)、を使用しますがsed -i.bak、これは非標準の拡張機能です-持っていない場合は、一時ファイルを使用してください。


3
\r交換での使用は移植できません。少なくとも、Mac OSXでは動作しません。
クオンルム14

unix2dosにはいくつかの実装があることに注意してください。linux.die.net/manの代わりに特定の実装(Debianにあるwaterlan.home.xs4all.nl/dos2unix.htmlなど)のホームページへのリンクを提供することをお勧めします。実装(またはバージョン)が文書化されています。注いくつかがあることをu2dux2dostodosだけでなく周りのコマンド。
ステファンシャゼラス14

2

Unixマシン(OS X、Linux)で変換を行う場合は、viまたはでファイルを開きますvim

$ vim my-file

Escキーを押して、挿入モードになっていないことを確認してから、入力します

:set ff=dos

または

:set fileformat=dos

これは、ファイル形式を設定することにより、適切な変換を行います。

ファイルを書き、エディターを終了するには

:wq

コマンドラインで次のことができます

$ vi +':w ++ff=dos' +':q' my-file

すべてのステップを説明してくれてありがとう-初心者にとっては、何が起こっているのかを理解するのがずっと簡単になります。
-user3616725

2

POSIXでこれを行うのは難しいです。

  • POSIX Sed\rまたはをサポートしていません\15。たとえそれができたとしても、インプレースオプション-iはPOSIXではありません

  • POSIX awkにはサポートしています\r\15、しかし、-i inplaceオプションではありませんPOSIX

  • d2udos2unixPOSIXユーティリティではありませんが、ex

  • POSIX exはサポートしていない\r\15\nまたは\12

キャリッジリターンを削除するには:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\r","");print>ARGV[1]}' file

改行を追加するには:

awk 'BEGIN{RS="\1";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file

1

これを行うポータブルシェル関数:

u2dos() (set -f; IFS='
'; printf '%s\r\n' $(cat "$1"))

それにより、次のことができます。

u2dos file >dosfile

1

awkで試すことができます

awk '{print $0 "\r"}'

または

awk -v r=$'\r' '{print $0 r}'

$'\r'以下のようないくつかのシェルでサポートされているとして引用ANSI-Cスタイルの一例であるksh93bashzshmkshとFreeBSD sh とシングルUnixの仕様の問題8に含まれる可能性が高いです

奇妙なキャラクターを表現する一般的な方法を提供します。例えば、これを試してください:

awk -v r=$'\U0001F608' '{print $0 r}'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.