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

Podobne dokumenty