web-dev-qa-db-ja.com

Unixの行末を変換するWindowsコマンド?

ファイルの行末を変換するWindowsコマンドはありますか?

サーバーを起動するために実行する必要があるtest.batがあります。 Perforceを使用しており、ワークスペースにUNIXの行末を含める必要があります。何らかの理由で、ワークスペースで行末をWindowsに変更することはできません。ただし、サーバーはWindows上で実行されます。

Batファイルを実行するたびに、Notepad ++で開き、[編集]→[EOL変換]→[Windows]を選択します。 Perforceと同期するたびに行末を手動で変更する必要がないように、これを自動化する方法はありますか?

前もって感謝します。

64
Deepti Jain

これは実際には、Windows NT以降に含まれているmoreコマンドを使用して非常に簡単に実行できます。 UNIX EOLを含むinput_filename(行末)\nをWindows EOLを含むoutput_filenameに変換する\r\nには、次のようにします。

TYPE input_filename | MORE /P > output_filename

moreコマンドには、知らない追加のフォーマットオプションがあります。 more/?を実行して、他のmoreができることを確認します。

56
TampaHaze

nix2dos ユーティリティを使用します。バイナリをダウンロードできます こちら

26
David Jashi

VBScriptの追加ツールなしでこれを行うことができます。

Do Until WScript.StdIn.AtEndOfStream
  WScript.StdOut.WriteLine WScript.StdIn.ReadLine
Loop

上記の行をファイルunix2dos.vbsに入れて、次のように実行します。

cscript //NoLogo unix2dos.vbs <C:\path\to\input.txt >C:\path\to\output.txt

またはこのように:

type C:\path\to\input.txt | cscript //NoLogo unix2dos.vbs >C:\path\to\output.txt

PowerShellでも実行できます。

(Get-Content "C:\path\to\input.txt") -replace "`n", "`r`n" |
  Set-Content "C:\path\to\output.txt"

これをさらに簡略化できます。

(Get-Content "C:\path\to\input.txt") | Set-Content "C:\path\to\output.txt"

Get-Contentは入力ファイルをあらゆる種類の改行(CR、LF、およびCR-LF)で暗黙的に分割し、Set-Contentは入力配列をWindowsの改行(CR -LF)ファイルに書き込む前。

15
Ansgar Wiechers

私はCRLFの問題を扱っていたので、(NodeJSで)変換のための本当に簡単なツールを構築することにしました。

NodeJS EOLコンバーターCLI

NodeJS with npmがインストールされている場合は、試してみてください:

npm i -g eol-converter-cli
eolConverter crlf "**/*.{txt,js,Java,etc}"

Glob正規表現(シェルと同じ正規表現)を使用して、パスを動的に構成できます。

したがって、NodeJSを使用できる場合は、非常に簡単であり、このコマンドを統合して、ワークスペース全体を目的の行末に変換できます。

11
Jurosh

WindowsのMOREは信頼性が低く、TABを必然的に破壊し、行を追加します。

nix2dos は、MinGW/MSYS、Cygutils、GnuWin32、およびその他のUNIXバイナリポートコレクションの一部でもあり、既にインストールされている場合があります。

python が存在する場合、このワンライナーは行末を現在のプラットフォームに変換します-任意のプラットフォームで:

TYPE UNIXFILE.EXT | python -c "import sys; sys.stdout.write(sys.stdin.read())" > MYPLATFILE.EXT

または

python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" UNIXFILE.EXT > MYPLATFILE.EXT

または、ワンライナーを.bat/Shellスクリプトに入れ、プラットフォームに応じてPATHに入れます:

@REM This is any2here.bat
python -c "import sys; sys.stdout.write(open(sys.argv[1]).read())" %1

そのようなツールを使用します

any2here UNIXFILE.EXT > MYPLATFILE.EXT
10
kxr

TampaHazeおよびMD XFの有益な回答に基づいて作成します。

これにより、現在のディレクトリのすべての.txtファイルがin placeからコマンドプロンプトでLFからCRLFに変更されます。

for /f %f in ('dir /b "*.txt"') do ( type %f | more /p > %f.1 & move %f.1 %f )

すべての変更を確認したくない場合

動く

移動/ y

サブディレクトリの変更を含めるには

dir/b

dir/b/s

以下の使用を促すことなく、サブディレクトリを含むバッチファイルでこれをすべて実行するには

@echo off
setlocal enabledelayedexpansion

for /f %%f in ('dir /s /b "*.txt"') do (
    type %%f | more /p > %%f.1 
    move /y %%f.1 %%f > nul
    @echo Changing LF-^>CRLF in File %%f
)
echo.
pause
8
uosjead

これを試して:

(for /f "delims=" %i in (file.unix) do @echo %i)>file.dos

セッションプロトコル:

 C:\ TEST> xxd -g1 file.unix 
 0000000:36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865 
 0000010:0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31 39 .486897463261819 
 0000020:37 0a 37 32 30 30 31 33 37 33 39 31 39 32 38 35 7.72001373919285 
 0000030:34 37 0a 35 30 32 32 38 31 35 37 33 32 30 32 30 47.5022815732020 
 0000040:35 32 34 0a 524。
 
 C:\ TEST>(for/f "delims ="% i in(file.unix)do @echo%i)> file.dos 
 
 C:\ TEST> xxd -g1 file.dos 
 0000000:36 31 36 38 39 36 32 39 33 30 38 31 30 38 36 35 6168962930810865 
 0000010:0d 0a 34 38 36 38 39 37 34 36 33 32 36 31 38 31 ..48689746326181 
 0000020:39 37 0d 0a 37 32 30 30 31 33 37 33 39 31 39 32 97..720013739192 
 0000030:38 35 34 37 0d 0a 35 30 32 32 38 31 35 37 33 32 8547..5022815732 
 0000040:30 32 30 35 32 34 0d 0a 020524 .. 
5
Endoro

これに対する私の貢献、フォルダー内のいくつかのファイルの変換:for %%z in (*.txt) do (for /f "delims=" %%i in (%%z) do @echo %%i)>%%z.tmp

3
Ricardo

これを行うための簡単なバッチスクリプトを作成できます。

TYPE %1 | MORE /P >%1.1
MOVE %1.1 %1

次に<batch script name> <FILE>を実行すると、<FILE>はすぐにDOSの行末に変換されます。

2
MD XF

Endoroの答えに基づきますが、空白を保持するには、これを試してください:

@echo off
setlocal enabledelayedexpansion
(for /f "tokens=* delims=:" %%i in ('findstr /n "^" file.unix') do (
        set line=%%i
        set line=!line:*:=!
        echo(!line!
        ))>file.dos
1
Ir Relevant

windowsgit bashを使用してgitプロジェクトのクローンを作成しました。すべてのファイルには、LFの末尾が付いていました。リポジトリには、デフォルトとしてCRLFの末尾があります。

プロジェクトを削除し、Windows Command Promptを使用して再度クローンを作成しました。 CRLFの末尾はそのままでした。私の場合、プロジェクトのエンディングを変更していた場合、それは大きなコミットをもたらし、チームメイトに問題を引き起こしていました。だから、このようにしました。これが誰かを助けることを願っています。

1
retr0

私はAWSコースを受講しており、AWS WebフォームのテキストボックスからWindows Notepadに頻繁にコピーする必要がありました。そのため、LFで区切られたテキストはクリップボードにのみ表示されます。 Delphiエディターに貼り付けてからCtrl + K + Wを押すと、CR + LF区切り文字でファイルにテキストが書き込まれることを偶然発見しました。 (他の多くのIDEエディターも同じことをするでしょう)。

0
RHenningsgard