Używanie grep w plikach tekstowych w stylu Mac

6

Kiedy uruchamiam grep na pliku tekstowym, otrzymuję nonsensowne wyniki. Wygląda na to, że cały plik jest wydrukowany, ale w jednym wierszu nadpisuje się. Czytam, że na komputerze Mac pliki tekstowe używają \ r zamiast normalnego \ n jako zakończenia linii. To by wyjaśniało, ale jak sprawić, by grep traktował tak, jakby to było \ n?

Używam Snow Leopard OS X i jestem całkiem nowy w używaniu Apple'a, ale od dawna programisty Linuksa.

DarenW
źródło

Odpowiedzi:

9

Nie możesz zmienić grepzachowania, ale możesz zmienić plik, który widzi:

tr '\r' '\n' <file | grep foo

Ponadto \rzakończenia linii są obecnie spuścizną; OS X oficjalnie używa \n, choć wciąż istnieją rzeczy, które nie zostały zaktualizowane. W szczególności AppleScript wciąż jeszcze nie nadrobił zaległości, co pokazuje również, że używa domyślnie ścieżek plików sprzed OS X i wymaga POSIX filewskazania ścieżek rodzimych dla OS X; Ponadto wiele aplikacji Carbon nadal korzysta \r, a Carbon jest strukturą przejściową z Mac OS 9 na OS X.

geekozaur
źródło
Dobrze wiedzieć, że \ n jest teraz dostępne. Więc muszę tylko przekonwertować kilka istniejących plików za pomocą \ r, aby użyć \ n.
DarenW
Twoja odpowiedź podwoiła również moją wiedzę na temat tego, co to „Carbon”!
DarenW
1
Jeśli nie chcesz faktycznie zmieniać zawartości samych plików źródłowych, ta odpowiedź jest lepsza, ponieważ robi to tłumaczenie In-Stream zamiast hakować oryginalny plik. Miły!
Viktor Haag
Zastanawiam się, czy rozsądnie byłoby stworzyć alias dla grep, który zawiera kawałek tr?
DarenW
To zależy od Ciebie; aliasy są na użytkownika. Jeśli potrzebujesz go bardzo, prawdopodobnie warto.
geekozaur
1

Typowym narzędziem do obsługi zakończeń linii jest flip . Dokonuje transformacji w miejscu dla plików między systemami Unix, DOS / Windows, starszymi formatami liniowymi komputerów Mac, a także może próbkować plik, aby poinformować Cię, jakiego typu obecnie uważa. Nie jest dostarczany z OSX, ale możesz pobrać pliki binarne z łącza, a także ze źródła.

W takim przypadku możesz najpierw flip -u yourFile.txtupewnić się, że używa on linii nowej, a nie linii, aby wyznaczyć linie, a następnie użyj grep.

Viktor Haag
źródło