Jestem programistą Java i używam Ubuntu do programowania. Projekt został stworzony w Windows z Eclipse i używa kodowania Windows-1252 .
Aby przekonwertować do UTF-8, użyłem programu recode :
find Web -iname \*.java | xargs recode CP1252...UTF-8
To polecenie powoduje ten błąd:
recode: Web/src/br/cits/projeto/geral/presentation/GravacaoMessageHelper.java failed: Ambiguous output in step `CR-LF..data
Szukałem tego i otrzymałem rozwiązanie w Bash i Windows, Recode: Niejednoznaczne wyjście w kroku `data..CR-LF ' i mówi:
Konwertuj zakończenia linii z CR / LF na pojedynczy LF: Edytuj plik za pomocą Vima, podaj polecenie
:set ff=unix
i zapisz plik. Przekodowywanie powinno teraz działać bez błędów.
Fajnie, ale mam wiele plików, z których mogę usunąć znak CR / LF, i nie mogę otworzyć każdego, aby to zrobić. Vi nie zapewnia żadnej opcji w wierszu poleceń dla operacji Bash.
Czy można do tego użyć seda? W jaki sposób?
windows
linux
end-of-line
MaikoID
źródło
źródło
recode
powoduje ten błąd podczas próby przekodowania pliku z mieszanym kodowaniem nowej linii dos (\r\n
- CRLF) i unix (\n
LF). Niestetyfromdos
, dawniej plik binarny jest obecnie aliasem do przekodowywania, który ma ten problem.vim +ex_command_one +ex_command_two ... file
awk
rozwiązania.Odpowiedzi:
Powinien istnieć program o nazwie
dos2unix
, który naprawi zakończenia linii. Jeśli nie ma go jeszcze na twoim Linuksie, powinien być dostępny za pośrednictwem menedżera pakietów.źródło
fromdos
jest tylko aliasem dorecode
, co spowoduje błąd OP wspomniany w plikach z mieszanym kodowaniem dos (\ r \ n - CRLF) i unix (\ n LF).dos2unix
Działa tylko uniwersalnie.find ./ -name "*.java" -exec dos2unix {} +
.sed nie może dopasować \ n, ponieważ końcowy znak nowej linii jest usuwany przed umieszczeniem linii w przestrzeni wzorca, ale może dopasować \ r, więc możesz przekonwertować \ r \ n (dos) na \ n (unix), usuwając \ r
Ostrzeżenie: spowoduje to zmianę oryginalnego pliku
Nie możesz jednak zmienić unixowego EOL na DOS lub starego mac (\ r) przez to. Więcej lektur tutaj:
Jak mogę zamienić znak nowej linii (\ n) używając seda?
źródło
sed -i
zmieni to oryginalny plik ! Ponieważ ludzie nie spodziewalibysed
się, że tak się zachowają, ostrzeżenie jest tutaj właściwe. Niewiele osób wie,-i
więc będą próbowaćsed -i ... file > file2
i nie oczekiwać, że oryginalny plik zostanie zmodyfikowany.sed
warianty rozpoznają niestandardową sekwencję symboliczną\r
. W takim przypadku spróbuj użyć literału ctrl-M (w wielu powłokach wpisz ctrl-V ctrl-M, aby utworzyć znak kontrolny literału).W rzeczywistości vim pozwala na to, czego szukasz. Wpisz vim i wpisz następujące polecenia:
Pierwsze z tych poleceń
**/*.java
rekurencyjnie ustawia listę argumentów na wszystkie pasujące pliki , czyli wszystkie pliki Java. Drugie z tych poleceń wykonuje kolejno następujące czynności dla każdego pliku na liście argumentów:źródło
dos2unix
w pętli for, ale nadal dobrze jest wiedzieć, jak to zrobić w Vimie!Polecenie tr może również zrobić to:
i powinien być dla Ciebie dostępny.
Będziesz musiał uruchomić tr z poziomu skryptu, ponieważ nie może on działać z nazwami plików. Na przykład utwórz plik myscript.sh:
Uruchomienie
myscript.sh
spowoduje przetworzenie wszystkich plików java w bieżącym katalogu i jego podkatalogach.źródło
Zrobię mały wyjątek od odpowiedzi jichao. Właściwie możesz zrobić wszystko, o czym właśnie mówił, dość łatwo. Zamiast
\n
szukać znaku, po prostu poszukaj powrotu karetki na końcu wiersza.Aby zmienić z unixowego z powrotem na dos, po prostu poszukaj ostatniego znaku w linii i dodaj do niego feed. (Dodam,
-r
aby było to łatwiejsze dzięki wyrażeniom regularnym grep).Teoretycznie plik można zmienić na styl mac, dodając kod do ostatniego przykładu, który również dołącza następny wiersz danych wejściowych do pierwszego wiersza, aż wszystkie wiersze zostaną przetworzone. Jednak nie będę próbował tutaj robić tego przykładu.
Ostrzeżenie: -i zmienia rzeczywisty plik. Jeśli chcesz wykonać kopię zapasową, dodaj ciąg znaków po
-i
. Spowoduje to przeniesienie istniejącego pliku do pliku o tej samej nazwie z twoimi znakami dodanymi na końcu.źródło
sed -i 's/$/\r/' ${FILE_NAME}
...-r
opcja nie jest przenośna; jeślised
go nie masz, może spróbuj-E
.Aby przezwyciężyć
prostym rozwiązaniem może być dodanie
-f
flagi wymuszającej konwersję.źródło
Czy próbowałeś znaleźć tutaj skrypt Pythona autorstwa Bryana Maupina ? (Zmodyfikowałem to trochę, aby było bardziej ogólne)
Możesz użyć tego skryptu z
źródło
Wróć do systemu Windows, powiedz Eclipse, aby zmienił kodowanie na UTF-8, a następnie z powrotem na Unix i uruchom
d2u
na plikach.źródło
fromdos
w 10.04 i jest częścią pakietutofrodos
.