Program trs służy do zamiany łańcuchów znakowych. Jego działanie jest podobne do polecenia tr, jednak zamienia napisy a nie tylko pojedyncze znaki. Program ten jest częścią pakietu konwert służącego do konwersji plików z różnymi kodowaniami znaków.

Instalacja trs

Jeśli używamy dystrybucji zarządzającej pakietami za pomocą yuma, wpisujemy:

yum install konwert

Jeśli używamy dystrybucji zarządzającej pakietami za pomocą apt, wpisujemy:

apt-get install konwert

Niestety, część dystrybucji nie posiada tego programu w repozytoriach. Ze względu na fakt, że ostatnie wydanie powstało w 1998 roku, kompilacja może przysporzyć odrobinę trudności. Poniżej metoda polegająca na pobraniu źródeł programu konwert wraz z patchem, a następnie wyciągnięciu, spatchowaniu i skompilowaniu samego programu trs (wraz z plikiem man):

wget https://launchpad.net/ubuntu/+archive/primary/+files/konwert_1.8.orig.tar.gz --no-check-certificate
wget https://launchpadlibrarian.net/40339444/konwert_1.8-11.2build1.diff.gz --no-check-certificate
tar xzvf konwert_1.8.orig.tar.gz konwert-1.8/bin/trs.cc
gzip -d konwert_1.8-11.2build1.diff.gz
cat konwert_1.8-11.2build1.diff |head -n 991 | tail -n 67
konwert-1.8/bin/trs.cc.patch
cd konwert-1.8/bin/
patch trs.cc trs.cc.patch
g++ -Wall -O2 -fomit-frame-pointer -pipe trs.cc -o trs
cd ../..
mv konwert-1.8/bin/trs ./trs
rm -r konwert-1.8

Po skompilowaniu warto umieścić program w katalogu, który jest dopisany do zmiennej $PATH, czyli na przykład /usr/bin.

Sposób użycia trs

Program trs służy do kopiowania strumienia wejściowego do strumienia wyjściowego przy okazji zmieniając znaki. Przykład użycia:

echo "Ala ma kota" |trs -e 'm sprzedał'

Powyższe polecenie da nam w efekcie zdanie “Ala sprzedała kota”. Podczas podawania reguł można stosować standardowych eskejpów. Najczęściej używane:

  • \n – kod znaku końca linii
  • \s – kod spacji
  • \t – kod tabulatora
  • \\ – kod znaku \
  • \/ – kod znaku /
  • \nnn – nnn to kod oct znaku
  • \xnn – nn to kod hex znaku
  • \! – pusty łańcuch

Podczas używania programu pierwsze reguły mają pierwszeństwo, dzięki czemu możemy uzyskać taki efekt:

$ echo Leeloo |trs -e 'el n e i i aqq o\}\n x o u'
Linux

Przykłady zastosowania trs

Programu można używać w skryptach, jest prostszy niż sed, a przy okazji pozwala na łatwe używanie znaku tabulatora czy znaku końca linii. Pozwala też zoptymalizować i przyspieszyć niektóre czynności.

Porównajmy ściąganie wszystkich plików *.jpg ze strony http://osworld.pl/spotkania. Pierwszy skrypt będzie używał opcji zaszytych w programie wget, drugi zaś będzie posiłkował się programem trs.

Skrypt 1

date
wget -m -l 1 -A jpg http://osworld.pl/spotkania -o wget_skr_1
date
cat wget_skr_1 |tail -n 2

Wynik działania

nie, 26 sie 2012, 16:19:41 CEST
nie, 26 sie 2012, 16:21:00 CEST
ZAKOŃCZONO --2012-08-26 16:21:00--
Pobrano: 113 plików, 11M w 49s (232 KB/s)

Skrypt 2

date
wget http://osworld.pl/spotkania -O poczatek.html -o wget_skr_2
cat poczatek.html|trs -e '\x27 \n \" \n'|grep jpg >lista
wget -m -i lista -o wget_skr_2
date
cat wget_skr_2 |tail -n 2

Wynik działania

nie, 26 sie 2012, 16:23:35 CEST
nie, 26 sie 2012, 16:24:06 CEST
ZAKOŃCZONO --2012-08-26 16:24:06--
Pobrano: 26 plików, 6,6M w 27s (249 KB/s)

Czas wykonywania zadań w pierwszym przypadku to 1:19, w drugim 0:31. Nie bez znaczenia jest też fakt, że oba skrypty zapisały na dysku taką samą liczbę obrazków, natomiast pierwszy skrypt tak naprawdę pobrał 113 plików, drugi zaś 27 plików. W tym, przypadku nie była to wielka różnica, jeśli jednak na stronie byłyby komentarze lub więcej linków, wtedy różnica w czasie i ilości ściągniętych (niekoniecznie zapisanych) plików byłaby znacznie większa.

  • Nic nie chcę mówić, ale od tego jest sed ;P

    • arek

      Kluczowe słowo w tytule – prosta :p
      Np zdefiniuj zamianę enterów na spacje sedem i trs, a następnie porównaj składnię.
      trs to coś między tr a sedem,

    • A po co mi do tego trs? Tak samo szybko zrobię to sedem i samym tr, a nie trzeba instalować kolejnego narzędzia. To samo zresztą tyczy się przykładów w artykule.

    • Red

      Wyważanie dawno otwartych drzwi…

      Zamiast marnować czas na szukanie takich narzędzi, sugeruję jednak nauczyć się co typowy Unix ma do zaoferowania…

      Sed może wydawać się trudny, ale przy tak banalnych przykładach jest równie banalny w użyciu.

      Pierwszy przykład:

      echo Ala ma kota | sed s/kota/wszy/

      Czy to na prawdę jest tak skomplikowane?

      Pytałeś się o znaki końca linii, konwersję unix -> dos można by zrobić np tak:

      sed 's/$/r/'

      (Znaczek $ oznacza koniec linii, teraz wystarczy dodać dosowe r i gotowe)

      Podsumowując:

      1) sed jest w każdej dystrybucji, natomiast używając tego czegoś tworzysz zależność od niestandardowych narzędzi – powodzenia przy instalacji na obcej maszynie.

      2) sed – proste rzeczy są proste, trudne są możliwe. Czy to coś pozwala na bardziej zaawansowaną edycję?

      Na koniec…. Czy przypadkiem nie wystarczyło by zdefiniować czegoś takiego w shellu?

      trs() { sed "s/$1/$2/"; }

    • Dokładnie tak. Prędzej zrobię coś sedem niż znajdę ten program, który nie wszędzie jest dostępny.

    • arek

      Sed prosty. No rozumiem. $ znakiem końca linii. No rozumiem. Zamienię literkę l na enter:
      "echo ala |sed 's/l/$/'
      a$a"
      Nie rozumiem.

  • yyyyyy

    A da się jakoś zmienić żebym nie musiał wpisywać całego pacman-color tylko pacman jako menedżer pakietów z kolorowaniem?

    • Piotr

      man alias

    • nowy

      Nie wiedzę powodu dla którego miałbym się uczyć sed, tr, trs skoro można wszystko to zrobić w awk, który też nie jest skomplikowany, a posiada od tych pierwszych znacznie większe możliwości.

    • Po co się uczyć AWK jako można pisać w C. Posiada on jeszcze większe możliwości.

    • Piotr

      Po co pisać programy, skoro można przepisywać na kartkę zmieniając słowa samemu?

    • Gerard Stańczak

      argument równie trafny co stwierdzenie "windows jest lepszy od linuksa bo można uruchamiać na nim zarówno php jak i .net"

  • Pingback: Casestudy – cykliczne pobieranie obrazków z serwisu Tumblr | OSWorld.pl()