Jaki jest najlepszy sposób przekonwertowania CRLF na feedy liniowe w plikach w systemie Linux?
Widziałem komendy sed , ale czy jest coś prostszego?
Jaki jest najlepszy sposób przekonwertowania CRLF na feedy liniowe w plikach w systemie Linux?
Widziałem komendy sed , ale czy jest coś prostszego?
Odpowiedzi:
Użyj tego polecenia:
fromdos yourtextfile
Odwrotnie:
todos yourtextfile
Te polecenia znajdują się w pakiecie tofrodos (w najnowszych dystrybucjach), który zapewnia także dwa opakowania unix2dos i dos2unix, które naśladują stare narzędzia uniksowe o tej samej nazwie.
find . -name '*.txt' -print0 | xargs -null fromdos
Zastosowanie dos2unix
.
dos2unix - konwerter formatu plików tekstowych z DOS / MAC na UNIX
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...] Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Wolę perl :
perl -lne 's/\r//g; print' winfile.txt > unixfile.txt
Ale to dobrze pasuje do moich zastosowań i bardzo łatwo mi to zapamiętać. Nie wszystkie systemy mają polecenie dos2unix, ale większość, nad którymi pracuję, ma interpreter perla.
Kolejnym jest recode , potężny zamiennik dos2unix i iconv; jest dostępny w pakiecie „recode” w repozytoriach Debiana:
recode ibmpc..lat1 winfile.txt # dos2unix
recode lat1..ibmpc unixfile.txt # unix2dos
Dla fanów awk :
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt
... i sed :
sed 's/\r$//' winfile.txt > unixfile.txt
A teraz, tylko nieco mniej skomplikowane niż ręczne usuwanie CR w edytorze szesnastkowym, prosto od jednego z naszych znajomych stackoverflow.com , używanego z interpreterem wołowiny (znajdującym się w przyjaznym sąsiedztwie repozytorium Debiana),
dos2unix in brainfuck !
,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.
wielkie podziękowania dla jk za marnowanie godziny życia na napisanie tego!
Robię to na Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
Myślę, że możesz też użyć tr
(chociaż nie mam śmiesznych plików w formacie, na których można by spróbować):
tr -d '\r' < file1 > file2
Znalazłem bardzo prosty sposób… Otwórz plik za pomocą nano: ## nano file.txt
naciśnij Ctrl + O, aby zapisać, ale przed naciśnięciem Enter naciśnij: Alt + D, aby przełączyć między zakończeniami linii DOS i Unix / Linux, lub: Alt + M, aby przełączyć między zakończeniami linii Mac i Unix / Linux, a następnie naciśnij Enter, aby zapisać i Ctrl + X, aby wyjść.
Alt+d
. Czasami alt zostaje przechwycony przez program terminalowy, więc możesz użyć esc+d
zamiast tego.
Jeśli potrzebujesz metody GUI, wypróbuj edytor tekstu Kate (inne zaawansowane edytory tekstu również mogą to obsłużyć). Otwórz find / Wymień dialogowe ( Ctrl+ R) i wymienić \r\n
z\n
. (Uwaga: musisz wybrać „Wyrażenie regularne” z menu rozwijanego i odznaczyć „Tylko zaznaczenie” z opcji).
EDIT: Albo, jeśli po prostu chcesz przekonwertować do formatu Unix, a następnie wybierz opcję Menu Tools
> End of Line
> Unix
.
\r\n
do \n
następnie przy użyciu wyszukiwania / zamiany jest łatwiejsze niż zapamiętywania który używa systemu operacyjnego, który wiersz kończący. ;)
Wklej to do skryptu Pyt2unix.py w Pythonie.
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
Powinien działać na dowolnej platformie z zainstalowanym Pythonem. Domena publiczna.
CR LF
do LF
korzystania z awk :
awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename
Przykład użycia:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C
Wyjaśnienie:
-v RS='\r?\n'
ustawi zmienną R ( wejście R ECORD s eparator) i \r?\n
, wejście oznacza są odczytywane wiersz po wierszu oddzielone LF (\n
), który może ( ?
) jest poprzedzony (CR \r
).
1
jest skrypt wykonywany przez awk. Skrypt składa się z condition { action }
. W tym przypadku 1
jest to warunek, który ocenia true. Akcja jest pomijana, dlatego wykonywana jest akcja domyślna, co oznacza wydrukowanie bieżącego wiersza (który można również zapisać jako{print $0}
zwykłą {print}
).
LF
do CR LF
: można ustawić zmienną ORS
( O utput R ECORD s eparator) modyfikacji końców linii wyjścia. Przykład:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Użyłem tego skryptu do plików potrzebnych do awaryjnego przesłania plików z systemu Windows do systemu unix.
find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix
find . -type f
Znajduje wszystkie pliki rekurencyjnie w katalogu, z którego uruchomiono polecenie
xargs file
Przekaż go do programu do plików , aby uzyskać analizę pliku.
grep CRLF
Chcemy tylko danych wyjściowych pliku, który pokazuje CRLF.
cut -d: -f1
Doprowadzić wydruk do koloru. odrzuć resztę. Powinniśmy mieć teraz tylko nazwę pliku
xargs dos2unix