Jaki jest najprostszy sposób na usunięcie wszystkich zwrotów karetki \r
z pliku w systemie Unix?
unix
carriage-return
Aldur
źródło
źródło
Odpowiedzi:
Mam zamiar założyć chodziło Ci powrotu karetki ( CR,
"\r"
,0x0d
) przy końcach linii zamiast po prostu ślepo wewnątrz pliku (można je mieć w środku ciągów dla wszystkich wiem). Używając tego pliku testowego tylko CRna końcu pierwszego wiersza:dos2unix
jest to droga, jeśli jest zainstalowany w twoim systemie:Jeśli z jakiegoś powodu
dos2unix
nie jest dla ciebie dostępny,sed
zrobi to:Jeśli z jakiegoś powodu
sed
nie jesteś dla ciebie dostępny,ed
zrób to w skomplikowany sposób:Jeśli nie masz żadnego z tych narzędzi zainstalowanych na swoim urządzeniu, masz większe problemy niż próba konwersji plików :-)
źródło
\r
działa tylko z GNU sed, w przeciwnym razie możesz to zrobić:sed `echo "s/\r//"`
sed
nieecho
rozpoznaj\r
na MacO. W tym przypadkuprintf "\r"
wydaje się, że działa.sed "s/$(printf '\r')\$//"
$
tak:sed $'s@\r@@g' |od -c
(ale jeśli chcesz zamienić z\n
tobą musiałby uciec)CTRL-V + CTRL-M
zamiast\r
wyglądu wygląda na to, że może działać.Zobacz tr (1)
źródło
tr
nie obsługuje\r
ucieczki, spróbuj,'\015'
a może dosłownie'^M'
(w wielu powłokach na wielu terminalach, ctrl-V ctrl-M wytworzy literalny znak ctrl-M).outfile = infile
?someProg <in >out && mv out in
.Stara szkoła:
źródło
Najprostszym sposobem na Linuksa jest, moim skromnym zdaniem,
Te silne cytaty wokół operatora podstawienia
's/\r//'
są niezbędne . Bez nich powłoka będzie interpretować\r
jako escape + r i zredukuje ją do zwykłegor
, i usunie wszystkie małe literyr
. Dlatego odpowiedź podana powyżej w 2009 roku przez Roba nie działa.Dodanie
/g
modyfikatora zapewnia\r
usunięcie nawet wielu , a nie tylko pierwszego.źródło
Istnieje narzędzie o nazwie dos2unix, które istnieje w wielu systemach i można je łatwo zainstalować w większości.
źródło
sed -i s/\r// <filename>
lub coś takiego; zobaczman sed
lub bogactwo informacji dostępnych w Internecie dotyczących korzystania zsed
.Jedna rzecz, na którą należy zwrócić uwagę, to dokładne znaczenie „powrotu karetki” powyżej; jeśli naprawdę masz na myśli pojedynczy znak kontrolny „powrót karetki”, to powyższy wzór jest poprawny. Jeśli masz na myśli, bardziej ogólnie, CRLF (powrót karetki i przesunięcie wiersza, czyli sposób, w jaki przesunięcia wiersza są wdrażane w systemie Windows), prawdopodobnie prawdopodobnie
\r\n
zamiast tego chcesz zamienić . Nagie źródła linii (nowa linia) w systemie Linux / Unix to\n
.źródło
s/\r//
wydaje się , że nie usuwa zwrotów karetki w OS X, wydaje się, żer
zamiast tego dosłownie usuwa znaki. Nie jestem pewien, dlaczego tak jest. Może ma to coś wspólnego ze sposobem cytowania ciągu? Jako obejście wydaje się , że używanieCTRL-V + CTRL-M
zamiast zamiast\r
działa.Jeśli jesteś użytkownikiem Vi, możesz otworzyć plik i usunąć znak powrotu karetki za pomocą:
lub z
Zauważ, że powinieneś wpisać ^ M, naciskając ctrl-v, a następnie ctrl-m.
źródło
^M
-s. Poradzenie sobie z tym to mnóstwo naciśnięć klawiszy, co nie jest stworzone dla vima;). Po prostu wybrałbymsed -i
, a następnie `-e 's / \ r $ // g', aby ograniczyć usuwanie do CR w EOL.Jeszcze raz rozwiązanie ... Ponieważ zawsze jest jeszcze jedno:
Jest fajny, ponieważ jest na miejscu i działa w każdym smaku unix / linux, z którym pracowałem.
źródło
Ktoś inny poleca
dos2unix
i ja też zdecydowanie polecam. Podaję tylko więcej szczegółów.Jeśli jest zainstalowany, przejdź do następnego kroku. Jeśli jeszcze nie został zainstalowany, zaleciłbym jego instalację poprzez
yum
:Następnie możesz użyć go w następujący sposób:
źródło
Jeśli używasz systemu operacyjnego (takiego jak OS X), który nie ma
dos2unix
polecenia, ale ma interpreter języka Python (wersja 2.5+), to polecenie jest równoważnedos2unix
poleceniu:To obsługuje zarówno nazwane pliki w wierszu poleceń, jak i potoki i przekierowania, podobnie jak
dos2unix
. Jeśli dodasz ten wiersz do pliku ~ / .bashrc (lub równoważnego pliku profilu dla innych powłok):... przy następnym logowaniu (lub uruchomieniu
source ~/.bashrc
w bieżącej sesji) będziesz mógł użyćdos2unix
nazwy w wierszu poleceń w taki sam sposób, jak w innych przykładach.źródło
Oto rzecz
%0d
jest znakiem powrotu karetki. Aby był kompatybilny z Uniksem. Musimy użyć poniższego polecenia.dos2unix fileName.extension fileName.extension
źródło
spróbuj przekonwertować plik dos na plik unix:
źródło
W systemie UNIX ... zauważyłem, że dos2unix usunął nagłówki Unicode z mojego pliku UTF-8. Pod git bash (Windows) następujący skrypt wydaje się działać dobrze. Używa sed. Zauważ, że usuwa tylko znaki powrotu karetki na końcach linii i zachowuje nagłówki Unicode.
źródło
Jeśli używasz środowiska X i masz odpowiedni edytor (kod Visual Studio), postąpiłbym zgodnie z zaleceniem:
Visual Studio Code: Jak wyświetlać zakończenia linii
Po prostu przejdź do prawego dolnego rogu ekranu, kod Visual Studio pokaże zarówno kodowanie pliku, jak i konwencję końca linii, a następnie plik - jednym kliknięciem możesz go przełączać.
Po prostu użyj kodu wizualnego jako zamiennika notatnika ++ w środowisku Linux i możesz zacząć.
źródło
Notepad++
poleceniaEdit / EOL Conversion / Unix (LF)
w systemie Windows przed skopiowaniem pliku do systemu Linux.Usuwanie
\r
w dowolnym systemie UNIX®:Większość istniejących rozwiązań w tym pytaniu jest specyficznych dla GNU i nie działałaby na OS X lub BSD; Poniższe rozwiązania powinny działać na wielu innych systemach UNIX, aw każdym powłoki, z
tcsh
celush
, ale wciąż działa nawet na GNU / Linux, too.Testowane na OS X, OpenBSD i NetBSD w
tcsh
oraz na Debian GNU / Linux wbash
.Z
sed
:W
tcsh
systemie OS Xsed
można używać następującego fragmentu koduprintf
, ponieważ anised
nieecho
obsługuje się go\r
w specjalny sposób, jak GNU:Z
tr
:Inną opcją jest
tr
:Różnica między
sed
itr
:Wygląda na to, że
tr
zachowuje brak końcowej nowej linii z pliku wejściowego, podczas gdysed
w OS X i NetBSD (ale nie w OpenBSD lub GNU / Linux) wstawia końcową nową linię na samym końcu pliku, nawet jeśli w danych wejściowych brakuje jakiejkolwiek na końcu\r
lub\n
na samym końcu pliku.Testowanie:
Oto kilka przykładowych testów, które można wykorzystać, aby upewnić się, że działa to w twoim systemie, używając
printf
ihexdump -C
; alternatywnie,od -c
można również użyć, jeśli brakuje twojego systemuhexdump
:źródło
Użyłem do tego Pythona, oto mój kod;
źródło
Chociaż jest to starszy post, ostatnio natknąłem się na ten sam problem. Ponieważ miałem wszystkie pliki do zmiany nazwy w / tmp / blah_dir /, ponieważ każdy plik w tym katalogu miał znak końcowy „/ r” (pokazujący „?” Na końcu pliku), więc zrobienie tego w sposób skryptowy było tylko tym, co mogłem wymyślić.
Chciałem zapisać końcowy plik o tej samej nazwie (bez kończenia żadnego znaku). W przypadku seda problemem była wyjściowa nazwa pliku, której potrzebowałem, aby wspomnieć o czymś innym (czego nie chciałem).
Wypróbowałem inne opcje, jak tutaj sugerowane (nie uważane za dos2unix z powodu pewnych ograniczeń), ale nie działało.
W końcu spróbowałem z „awk”, który działał tam, gdzie użyłem „\ r” jako separatora i wziąłem pierwszą część :
sztuczka polega na:
Poniżej fragmentu skryptu, którego użyłem (gdzie wszystkie pliki miały „\ r” jako znak końcowy na ścieżce / tmp / blah_dir /), aby naprawić mój problem:
Uwaga: ten przykład nie jest bardzo dokładny, chociaż jest bliski temu, co pracowałem (wspomnienie tutaj tylko po to, aby lepiej zrozumieć, co zrobiłem)
źródło
Zrobiłem ten skrypt powłoki, aby usunąć znak \ r. Działa w solaris i red-hat:
źródło
możesz po prostu to zrobić:
źródło
a * b
...