Converti le terminazioni di linea Unix in Windows


38

Di recente sono tornato a Windows da Linux. Ho alcuni file con CRLF, alcuni con LF e altri che sono misti. Esiste un'utilità che mi aiuterà a trovare tutti i miei file toccati da Unix e convertirli in file CRLF corretti?

L'utilità deve essere eseguita su Windows, non su Linux. Mi sono già trasferito Preferirei non installare Cygwin se posso evitarlo.


1
correlati: vedi superuser.com/questions/38744 superuser.com/questions/27060 superuser.com/questions/52044 ... qualsiasi strumento menzionato in quelli può essere invertito per realizzare quello che vuoi fare
quack quixote

Interrogazione duplicata
ukanth,

Le soluzioni in quelle cosiddette domande duplicate funzionano tutte su piattaforme Linux o preformano la conversione opposta. Non ho più Linux. Ho windows.
Matthew Scouten,

1
sono tutti disponibili per Windows tramite Cygwin, GnuWin32, UnxUtils o simili. credo che ci siano script Powershell che possono fare anche questo, anche se non ne so abbastanza per fornire alcun collegamento.
Quack Quixote,

1
@quack: la domanda specifica che l'utente sta cercando qualcosa che farà il lavoro su Windows, usando un'utilità di Windows.
Brian Lacy,

Risposte:


34

Puoi convertirli con l' unix2dosutilità sulla tua piattaforma Linux. Ci sono unix2dos versioni disponibili anche per Windows .

Se hai installato Perl puoi anche usare questo solo rivestimento:

perl -p -e 's/\n/\r\n/' < UNIX_LF.txt > WINDOWS_CRLF.txt

Ho fatto qualcosa di simile a questo, ma ho usato Python.
Matthew Scouten,

2
@Matthew Scouten: quindi ... hai trovato un'utilità unix che gira su Windows! congratulazioni!
Quack Quixote,

8
sì e no. HO SCRITTO la mia utilità distrutta. Avrei potuto farlo dall'inizio, ma speravo di risparmiare 30 minuti. Sfortunatamente non ero contento di nessuna utilità disponibile. Il più vicino che ho trovato corrotto qualsiasi file binario nella directory.
Matthew Scouten,

Ci sono problemi nella conversione con dos2unix e unix2dos - se il file ha mescolato CRLF e LF potrebbero esserci delle occorrenze che non verrebbero sostituite.
pbies,

17

Ecco un modo semplice e veloce.

Trascina e rilascia il file di testo in Chrome (non conosco altri browser), quindi taglia e incolla il file originale :)


2
hehe ... questa risposta mi ha fatto lol
ClintM

tutti i browser possono leggere bene le terminazioni di linea Unix, incluso IE. Ma anche allora WordPad può farlo, così come il moderno Blocco note . La cosa importante qui è come convertire automaticamente più file
phuclv,

10

Quello che ho trovato migliore per ricorrere in modo ricorsivo alle cartelle, consentendo i filtri di file e permettendo una semplice ricerca di "\ r \ n" e sostituendolo con solo "\ n" era Notepad ++ .

Notepad ++ è uno dei migliori programmi di blocco note open source gratuiti per Windows. È molto semplice e potente. Ha gestito la linea che termina la ricerca / sostituzione bene. Un appaltatore controlla un gruppo di file .c e .h nel nostro repository con terminazioni di linea Linux \ r \ n, ma poiché la maggior parte delle persone ha standardizzato gli strumenti di build di Windows / Eclipse, i file non verranno compilati fino alla conversione dei finali di linea .


8
Penso che tu abbia invertito le conclusioni lì: Linux è \ n, Windows è \ r \ n
Matthew Scouten

10
Notepad ++ ha anche un semplice Edit -> EOL Conversionmenu se il numero di file da convertire è piccolo.
user1071136

8

Usa il coltellino svizzero .

Ad esempio: sfk addcr -dir . -file .txt -norec
modifica le terminazioni LF in CR / LF per Windows, su tutti i file .txt della directory corrente, ma NON all'interno delle sottodirectory (nessuna ricorsione).

Ma questo programma fa molto di più.


Non specifico -norecperché voglio che si verifichi la ricorsione, ma non sembra
Csaba Toth il

6

Su Cygwin, è possibile convertire tra i file AKA Unix e "DOS" Windows utilizzando due utility integrate:

Converti in formato DOS CR / LF:

u2d filename

Converti di nuovo in formato Unix CR:

d2u filename

Il file viene lasciato in posizione con lo stesso nome.

Godere! pagliaio


A volte viene chiamato dos2unixo unix2dosnel caso in cui non sia possibile trovarlo come u2d o d2u. C'è ancheunix2mac
gtatr il

3

Ho intenzione di gettare questa soluzione là fuori. Git lo farà. Vedi questo post a riguardo

Quindi teoricamente potresti farlo per convertire un intero albero

cd root/of/tree
git init .
git add .
git commit -m "initial commit"
echo "* text eol=crlf" > .gitattributes
git rm --cached -r .
git reset --hard

Cambia crlfin lfse vuoi andare dall'altra parte. NOTA: non hai ancora finito, continua a leggere

Digitare git statusper vedere quali file saranno interessati. Potrebbe essere necessario aggiungere righe come

*.jpg binary
*.png binary
*.gif binary

ecc per .gitattributesevitare la conversione di determinati file. Puoi anche contrassegnare esplicitamente alcuni file come testo

*.md text
*.css text

Quindi ripeti queste 2 righe dopo averle modificate .gitattributes

git rm --cached -r .
git reset --hard

Quindi utilizzare git statusnuovamente per vedere quali file verranno modificati. Quando sei sicuro che tutti i file che vuoi siano interessati sono elencati da git statusallora esegui il commit

git add .
git commit -m "normalize line endings"

ora controlla di nuovo tutti i file

git rm --cached -r .
git reset --hard

Ora dovrebbero avere qualunque fine di linea desiderata

** NOTA: se si utilizzava già git, saltare i primi 3 comandi comandi git. Se non stavi usando git ora puoi eliminare il .gitattributesfile e la .gitcartella.

** Esegui il backup dei tuoi file: git rm --cached -rli elimina tutti (anche se teoricamente sono nel tuo repository git (la cartella .git) che è il modo in cui vengono ripristinati dall'ultimo comando git reset --hard. È solo dal momento che i file vengono eliminati, probabilmente è meglio eseguirne il backup su.


1

Utilizzare un editor di testo che comprenda entrambe le terminazioni di riga come SciTE o Notepad ++ se non è necessario convertire tutte le terminazioni di riga in tutti i file, ma non si desidera vedere l'intero file raggruppato nella prima riga.


Questo è quello che hanno detto quando ho avuto il problema inverso mentre passavo a Linux. Ho continuato a imbattermi in strumenti che avevano problemi con le terminazioni di riga sbagliate. E NIENTE gestisce ragionevolmente terminazioni di linee miste.
Matthew Scouten,

@Matthew So che lo scite gestisce correttamente le terminazioni di linea unix / windows . Lo uso a tale scopo nei vms di Windows che eseguo su Linux durante la modifica dei file sul sistema host.
nelaaro,

Sono sicuro che gli editor che consigli funzioneranno bene. ma ad un certo punto, dovrò alimentare il file di testo ad altri strumenti, e quello strumento NON lo farà. A quel punto, avere un editor di testo che gestisca bene le cose peggiorerà nascondendo il problema. e scommetto che gestisce ancora male i finali misti (o almeno con le stranezze).
Matthew Scouten,

1
+1 per l'opzione notepad ++ per convertire i finali di bugie. Ed ecco come fare più precisamente (vedi "Metodo 2"): staffwww.fullcoll.edu/brippe/csci123/saveAsUnix.aspx
wip

Notepad ++ ha già le soluzioni per convertire terminazioni di linea, codifiche tra le altre cose
phuclv,

0

Esistono molti modi per tradurre i caratteri eoln in file TEXT e ognuno ha un preferito.

Ma trasferisco sempre i file da Linux a Windows in modalità BINARY, quindi apro i file TEXT in Windows con un editor in grado di aprire entrambi i tipi e salvarli in entrambe le forme, se necessario.

Ho usato Programmers File Editor per questo, ma anche Notepad ++ può farlo. WordPad è anche utile [almeno, per visualizzare i file con terminazione LF].

Sto pensando ai semplici file di testo che potrebbero aver avuto origine su Linux e che devono essere leggibili nel mondo (standard defacto) di Windows. Non sono sicuro di cosa intendevi con "file unix-touched".


Il problema con questo metodo è che esegue solo un file alla volta.
Matthew Scouten,

"file unix-touched" è la mia parola per i file CRLF-LF sia solo LF che misti. Una volta che un file è stato modificato con strumenti unix-oid, tende a "infettarsi" con le righe solo LF.
Matthew Scouten,

2
Quello che ero davvero dicendo era che scegliendo il software giusto per visualizzare i file di testo, non è necessario convertirli affatto. A proposito, ho evitato di assumerti il ​​compito di descrivere i file terminati CRLF come "corretti". Dipende interamente dal tuo punto di vista. Ogni metodo è appropriato nel proprio sistema operativo. Quando un file viene spostato su un altro sistema operativo, allora troviamo che Win / Mac / Linux sono tutti diversi. Sospetto che il metodo Unix / Linux sia quello originale.
padiglione

3
Sospetti di aver torto. Lo standard ASCII è stato originariamente sviluppato per le macchine del teletipo e ha richiesto il CRLF. La maggior parte dei protocolli Internet (inclusi HTTP, SMTP, FTP, IRC e molti altri) richiedono anche terminazioni CRLF (la maggior parte delle implementazioni accetta LF nudo per la compatibilità con i programmi Unix non conformi). In questo caso, Windows sta seguendo lo standard e Unix e Mac lo stanno rompendo.
Matthew Scouten

0

Per offrire più opzioni (anche se mi è piaciuta molto la risposta hack di user45832 ):

Convertitori online

Immagino che un programma FTP GUI lo farà automaticamente

One-latch batch / DOS (rimuove le righe vuote) :

FOR /F "eol= delims= usebackq" %a IN (infile.txt) DO (ECHO %a>> outfile.txt)

PowerShell:

gc infile.txt | %{$_.split("`n")} | Out-File outfile.txt

Ho gli ultimi due da qui


0

Ottieni AWK per Windows .

Converti i finali di linea Unix in finali di linea di Windows:

awk 'sub("$", "\r")' unixfile.txt > winfile.txt

Converti i finali di linea di Windows in finali di linea Unix:

awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt

Le versioni precedenti di awknon includono la subfunzione. In tali casi, utilizzare lo stesso comando, ma sostituire awkcon gawko nawk.

fonte


0

Su Wikipedia c'è una soluzione in cmd:

TYPE unix_file | FIND /V "" > dos_file

In PowerShell ci sono vari modi per farlo invertendo ciò che è stato fatto in questa domanda .

(Get-Content $file -Raw).Replace("`n", "`r`n") | Set-Content $path -Force

(Get-Content $infile) -join "`r`n" > $outfile

$text = [IO.File]::ReadAllText($original_file) -replace "`n", "`r`n"
[IO.File]::WriteAllText($original_file, $text)

È anche possibile farlo in VBScript e JScript che sono anche strumenti che sono già disponibili in Windows senza installare un'applicazione di terze parti.


0

La mia distribuzione Linux ha due piccole utility chiamate fromdose todosche uso per questo compito.


L'OP chiede uno strumento di Windows
phuclv,

-2

Ho usato per aprire il file in "modifica" e salvare in quanto il lavoro è stato fatto ...


cos'è "modifica"? non esiste tale strumento in Windows 10
phuclv,


ovviamente l'ho usato editin DOS ma questa domanda riguarda Windows
phuclv,

1
editfaceva parte di Windows fino a Windows XP. La mia risposta ha circa 8 anni. A quel tempo editfaceva parte dell'installazione di Windows in molti casi ...
Radek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.