web-dev-qa-db-ja.com

すべての改行の前に改行を追加するにはどうすればよいですか?

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

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

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

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

28
modulitos

nix2dos (Debianにあります)を使用できます。

unix2dos file

この実装は、すべてのCRの前にLFを挿入せず、1つ(および1つだけ)だけ前に付いていないLFsの前にのみ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
38
cuonglm

これがまさに unix2dos が行うことです:

$ unix2dos file.txt

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

sedを使用したい場合は、各行の終わりに改行を挿入できます。

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

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

9
Michael Homer

POSIXでこれを行うのは注意が必要です。

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

  • POSIX Awk\rおよび\15をサポートしていますが、-i inplaceオプションはPOSIXではありません

  • d2uおよびdos2unixPOSIXユーティリティ ではありません、ただし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
2
Steven Penny

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

$ vim my-file

eSCキーを押して、挿入モードになっていないことを確認してから、次のように入力します。

:set ff=dos

または

:set fileformat=dos

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

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

:wq

コマンドラインでできること

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

Awkで試すことができます

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

または

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

$'\r'は、ksh93bashzshmkshやFreeBSDなどのいくつかのシェルでサポートされているANSI-Cスタイルの引用の例ですshおそらく、Single Unix Specificationの第8号に含まれる可能性があります

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

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

これを行う移植可能なシェル関数:

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

それであなたは行うことができます:

u2dos file >dosfile
1
mikeserv