Download: LinuxUserCommand
Transkrypt
Download: LinuxUserCommand
LINUX USER Wiersz poleceń: tr, dos2unix Korzystanie z poleceń tr i dos2unix TRANSLATORY Narzędzie tr ma ogromną moc, choć nie robi nic nadzwyczajnego: zamienia fragmenty łańcuchów tekstowych na inne. Ten programik może służyć do różnych zadań: od usuwania niepotrzebnych spacji po podstawianie liter... w każdym razie potrafi zaskoczyć wszechstronnością. HEIKE JURZIK P olecenie tr służy do zastępowania znaków w strumieniach tekstowych innymi znakami. Program odczytuje dane z wejścia standardowego, a wyniki wysyła na standardowe wyjście. Oczywiście, oba te strumienie można przekierować, posługując się odpowiednimi operatorami. Polecenie tr wręcz wyróżnia się uniwersalnością na tle innych narzędzi. Proste podstawienia Polecenie tr wymaga podania jako argumentów dwóch łańcuchów. Wszystkie wystąpienia pierwszego łańcucha zastępuje zawartością drugiego. Wcale nie jest to tak skomplikowane, jak mogłoby się wydawać. Spójrzmy na prosty przykład. Następujące polecenie spowoduje zastąpienie wszystkich liter „e” w słowie „Petronella” literami „a”: $ echo Petronella | tr 'e' 'a' Patronalla 98 NUMER 15 KWIECIEŃ 2005 Oczywiście, możemy też podstawiać znaki występujące w plikach. Polecenie tr '1' '2' < test.txt powoduje wysłanie zawartości pliku test.txt na wyjście standardowe, z uprzednim podstawieniem cyfry '2' w każde miejsce wystąpienia cyfry '1'. Poszczególne znaki w argumentach przekazywanych programowi są traktowane oddzielnie. To znaczy, każdy znak pierwszego argumentu jest zastępowany odpowiednikiem drugiego argumentu. Na przykład, tr 'abc' 'xyz' spowoduje zastąpienie znaku „a” znakiem „x”, „b” znakiem „y”, a „c” znakiem „z”. Jeśli drugi łańcuch jest krótszy od pierwszego, tr „dopełnia” go ostatnim wymienionym znakiem. To znaczy, że nasz programik nie ma nic przeciwko zapisowi tr 'abc' 'z' < test txt. Po prostu wszystkie wystąpienia liter „a”, „b” oraz „c” zastępuje literą „z”. Natomiast nie uda nam się zastąpić wystąpień litery „ä” ciągiem „ae”. Pola mają różną długość, w związku z czym „ä” zostanie zastąpione literą „a”. Do zadań tego rodzaju nadaje się np. sed. WWW.LINUX-MAGAZINE.PL Wielkość liter Polecenie tr świetnie sprawdza się przy hurtowym zamienianiu liter małych na wielkie i odwrotnie. Zadanie tego typu najłatwiej wykonać, używając zakresów znaków jako argumentów, np.: tr 'a-z' 'A-Z' < test.txt Ewentualnie można użyć słów kluczowych służących specjalnie do tego celu: tr [: lower:] [: upper:] < test.U txt Wszystko prócz... Polecenie tr udostępnia parametry zmieniające działanie programu. Na przykład, opcja -d powoduje usuwanie wskazanych znaków: tr -d '0-9' < test.txt Powyższe polecenie wysyła wszystkie cyfry wskazanego pliku tekstowego do czarnej dziury. Jeśli dodamy do tego opcję -c, będziemy mogli zrobić jeszcze ciekawsze rzeczy. Załóżmy, że chcemy usunąć wszystko Wiersz poleceń: tr, dos2unix prócz spacji oraz wielkich i małych znaków. Opcja -c służy do określania, czego tr ma nie usuwać: tr -c -d 'A-Z a-z' < test.txt Natomiast opcja -s może nam pomóc skutecznie zmniejszyć wielkość pliku – np. dziennika rejestru pełnego niewidocznych znaków (spacji, tabulatorów itp.). Wymaga ona podania dwóch argumentów. Na przykład, polecenie tr -s ' ' < test.txt usuwa wszystkie niewidoczne znaki z pliku test. txt. Jeśli natomiast musimy usunąć podwójne spacje lub tabulatory, zastępując je pojedynczymi odstępami, wywołujemy polecenie tr -s z dwoma argumentami: jest całkiem prosta: w tych dwóch systemach w różny sposób oznaczany jest koniec wiersza. W Windows podział wiersza jest to kombinacją znaków \r\n, natomiast w Linuksie – tylk znak \n. tr ułatwia wymianę plików między tymi dwoma systemami. Polecenie tr -d '\r' < wintext > linuxtext spowoduje usunięcie dodatkowego znaku \r z końca każdej linijki pliku w formacie Windows. Opcja -d każe programowi tr usunąć wskazany znak. Operatorem < wskazujemy plik wejściowy wintext, zaś operatorem > – plik wyjściowy linuxtext, w którym zostanie zapisany „oczyszczony” tekst. tr -s [: blank:] ' ' < test.txt Alternatywne konwertery W tym przypadku tr zastępuje wielokrotne wystąpienia sąsiadujących spacji lub tabulatorów pojedynczymi odstępami. Przenoszenie plików między systemami Jeżeli często przenosimy pliki z systemu Windows na Linuksa, zauważymy, że na końcach wierszy otwieranych w edytorze znajdują się dziwne znaki. Gdy otworzymy w edytorze Vim plik ASCII utworzony w systemie Windows, zobaczymy w nim wiele znaków wyświetlanych jako ^M. Przyczyna Podział wiersza: Sposób zapisu miejsca przełamania znaków w systemach komputerowych wywodzi się z zasady działania maszyny do pisania. W komputerach znane są dwa znaki odpowiadające dwóm czynnościom wykonywanym dawniej przez maszynistkę: „wysuwu wiersza” (line feed) oraz „powrotu karetki” (carriage return). Podział wiersza jest różnie zapisywany w różnych systemach operacyjnych. W Linuksie w miejscu tym wstawiany jest tylko znak nowego wiersza (\n od „new line”), a w systemach DOS/ Windows dodatkowo jeszcze znak powrotu karetki (\r od „return”). Do konwertowania plików między systemami Linux i Windows nadają się również programy dos2unix oraz unix2dos. Aby przekonwertować plik tekstowy z formatu Windows na format linuksowy, wystarczy wpisać: $ dos2unix -n wintextU linuxtext dos2unix: converting fileU wintext to file linuxtextU in UNIX format... W powyższym poleceniu użyliśmy opcji -n, po której wystarczy podać nazwy plików wejściowego i wyjściowego. O innych ciekawych zastosowaniach tego narzędzia można poczytać w jego podręczniku man. Opcja -k powoduje zachowanie oryginalnego znacznika czasu, zaś -o powoduje zapisanie zmian bezpośrednio w oryginalnym pliku. unix2dos robi to samo, ale w drugim kierunku: unix2dos -n linuxtext wintext W niektórych systemach polecenia te są tylko dowiązaniami symbolicznymi odpowiednio do programów fromdos i todos. Programy te obsługują nieco inną składnię i in- WWW.LINUX-MAGAZINE.PL LINUX USER ne parametry. Nawet jeśli nie tworzymy nowego pliku, warto użyć opcji -b, która zachowuje kopię zapasową pliku oryginalnego. Może się przydać także opcja -a. Zastosowana w poleceniu fromdos powoduje usunięcie wszystkich znaków powrotu karetki (a nie tylko tych poprzedzonych znakiem nowego wiersza). Natomiast w przypadku polecenia todos opcja ta powoduje przekonwertowanie wszystkich nowych wierszy na pary znaków CR-LF. Domyślnie konwertowane są tylko te niepoprzedzone znakiem powrotu karetki. Żeby więc uzyskać efekt taki, jak przy wcześniej pokazanych wywołaniach poleceń dos2unix i unix2dos, musielibyśmy użyć następujących zapisów: cat wintext | fromdosU -a > linuxtext cat linuxtext | todos -aU > wintext Współpraca z innymi programami O prawdziwej użyteczności narzędzia tr przekonamy się jednak dopiero wtedy, gdy połączymy je z innymi poleceniami powłoki. Wyobraźmy sobie, że znaleźliśmy dużą grupę plików, w których nazwach występują spacje. Spacje chcemy zamienić na symbole podkreślenia. Sprawę załatwi nam pętla for powłoki, polecenie mv i właśnie narzędzie tr: $ for i in *; do mv -v "$i"U `echo $i | tr ' ' '_'`; done 'file with blank' ->U 'file_with_blank' 'file with blank 2' ->U 'file_with_blank_2' W tłumaczeniu na polski powyższe polecenie brzmiałoby tak: „na wszystkich plikach bieżącego katalogu wykonaj następujące czynności: zmień nazwę pliku, z wyświetleniem odpowiedniego komunikatu, na nazwę będącą wynikiem podstawienia wykonanego przez polecenie tr”. ■ NUMER 15 KWIECIEŃ 2005 99