
Heb je een no-nonsense methode nodig voor het manipuleren van een tekststroom in Linux? Zoek niet verder dan het tr-commando, dat u tijd kan besparen bij het vervangen, verwijderen, combineren en comprimeren van invoertekst. Dit is hoe het gedaan is.
Wat is het tr-commando?
Karakters vervangen
Bereiken en tokens gebruiken
De lucifers omkeren
Tekens verwijderen en samenpersen
Tekens verwijderen
Lijnen combineren en splitsen
tr gebruiken met pijpen
Eenvoudig is zoals eenvoudig doet
Wat is het tr-commando?
De Linux tr commando is een snel en eenvoudig hulpprogramma voor het verwijderen van ongewenste tekens uit tekststromen en voor andere handige manipulatietrucs. Het dankt zijn naam aan het woord “vertalen” en tr’s wortels zitten diep in de Unix-traditie.
Zoals we allemaal weten, is Linux een open-source herschrijving van Unix. Het voegt ook zijn eigen dingen toe aan de mix. Het is geen byte-voor-byte-kloon, maar het ontleent duidelijk veel van zijn ontwerpprincipes en technische besturing aan het Unix-besturingssysteem.
Hoewel er tot nu toe slechts twee Linux-distributies zijn gecertificeerd als POSIX-compatibel en officieel geaccepteerd als implementaties van Unix – EulerOS en Inspur K-UX – heeft Linux Unix bijna volledig verdrongen in de zakenwereld.
Alle Linux-distributies, althans in hun kernhulpprogramma’s, houden zich aan de Unix-filosofie. De Unix-filosofie vat de visie samen die de Unix-pioniers hadden voor hun nieuwe besturingssysteem. Het wordt vaak geparafraseerd als “Schrijf programma’s die één ding goed doen.” Maar er is meer dan dat.
Een van de krachtigste innovaties was dat programma’s output moesten genereren die gebruikt kon worden als input voor andere programma’s. De mogelijkheid om opdrachtregelhulpprogramma’s aan elkaar te koppelen, waarbij de uitvoerstroom van het ene programma wordt gebruikt als de invoerstroom voor het volgende programma in de rij, is enorm krachtig.
Soms wilt u de uitvoer van een programma verfijnen of aanpassen voordat deze het volgende programma in de rij bereikt. Of misschien haalt u uw invoer niet uit een Linux-opdrachtregelprogramma, maar streamt u tekst uit een bestand dat niet is gemaakt met uw specifieke behoeften in gedachten.
Dit is waar tr komt tot zijn recht. Hiermee kunt u een reeks eenvoudige transformaties uitvoeren op de invoerstroom om de uitvoerstroom te produceren. Die uitvoerstroom kan worden omgeleid naar een bestand, worden ingevoerd in een ander Linux-programma of zelfs in een andere instantie van tr om meerdere transformaties op de stream toe te passen.
Karakters vervangen
De tr commando werkt op zijn invoerstroom volgens regels. Gebruikt zonder opdrachtregelopties, de standaardactie van tr is om tekens in de invoerstroom te vervangen door andere tekens.
Commando’s om tr vereisen meestal twee reeksen tekens. De eerste set bevat de tekens die worden vervangen als ze in de invoerstroom worden gevonden. De tweede set bevat de tekens waarmee ze worden vervangen.
De manier waarop dit werkt, is dat het eerste teken in set één wordt vervangen door het eerste teken in set twee. Het voorkomen van het tweede teken in set één wordt vervangen door het tweede teken in set twee, enzovoort.
In dit voorbeeld wordt gezocht naar de letter “c” in de invoerstroom naar tr, en vervang elk voorkomen door de letter “z.” Let daar op tr is hoofdlettergevoelig.
We gebruiken echo om wat tekst in te drukken tr .
echo abcdefabc | tr 'c' 'z'

Alle voorkomens van “c” worden vervangen door “z” en de nieuwe string wordt naar het terminalvenster geschreven.
Deze keer zoeken we naar twee letters, “a” en “c”. Merk op dat we niet zoeken naar ‘ac’. We zoeken naar ‘a’ en zoeken vervolgens naar ‘c’. We gaan elk voorkomen van “a” vervangen door “x” en elk voorkomen van “c” door “z”.
echo abcdefabc | tr 'ac' 'xz'

Om dit te laten werken, moet u in beide sets hetzelfde aantal tekens hebben. Als je dat niet doet, krijg je voorspelbaar, maar waarschijnlijk ongewenst gedrag.
echo 'call me Ishmael.' | tr 'abcdjklm' '123'

Er zijn meer personages in set één dan in set twee. De letters “d” tot “m” hebben geen corresponderend karakter in set twee. Ze worden nog steeds vervangen, maar ze worden allemaal vervangen door het laatste personage in set twee.
Het is zo goed als mogelijk dat dit in sommige gevallen nuttig kan zijn, maar als u dit wilt voorkomen, kunt u de -t (afkappen) optie. Dit vervangt alleen de tekens in set één die een overeenkomend teken hebben in set twee.
echo 'call me Ishmael.' | tr -t 'abcdjklm' '123'

Bereiken en tokens gebruiken
Set één en set twee kunnen reeksen tekens bevatten. Bijvoorbeeld, [a-z] staat voor alle kleine letters, en [A-Z] vertegenwoordigt alle hoofdletters. We kunnen hiervan gebruik maken om het hoofdlettergebruik van een tekststroom te wijzigen.
Hiermee wordt de invoerstroom omgezet in hoofdletters.
echo "How-To Geek" | tr '[a-z]' '[A-Z]'

Om de zaak in de andere richting om te draaien, kunnen we dezelfde opdracht gebruiken, maar met het bereik van hoofdletters en kleine letters verwisseld op de opdrachtregel.
echo "How-To Geek" | tr '[A-Z]' '[a-z]'

Er zijn tokens die we kunnen gebruiken voor enkele van de veelvoorkomende gevallen waarmee we misschien willen matchen.
- [:alnum:]: Letters en cijfers.
- [:alpha:]: Alleen brieven.
- [:digit:]: Alleen cijfers.
- [:blank:]: Tabbladen en spaties.
- [:space:]: Alle witruimte, inclusief tekens voor nieuwe regels.
- [:graph:]: Alle tekens inclusief symbolen, maar geen spaties.
- [:print:]: Alle tekens inclusief symbolen, inclusief spaties.
- [:punct:]: Alle leestekens.
- [:lower:]: Kleine letters.
- [:upper:]: Hoofdletters.
We kunnen onze kleine letters naar hoofdletters en hoofdletters naar kleine letters net zo gemakkelijk omzetten met behulp van tokens.
echo "How-To Geek" | tr '[:lower:]' '[:upper:]'
echo "How-To Geek" | tr '[:upper:]' '[:lower:]'

De lucifers omkeren
De -c (complement) optie komt overeen met alle karakters behalve die in de eerste set. Deze opdracht converteert alles behalve de letter “c” naar een koppelteken ” - “.
echo abcdefc | tr -c 'c' '-'

Deze opdracht voegt de letter “a” toe aan de eerste set. Alles behalve “a” of “c” wordt omgezet in een koppelteken ” - ” karakter.
echo abcdefc | tr -c 'ac' '-'

Tekens verwijderen en samenpersen
We kunnen gebruiken tr om karakters helemaal te verwijderen, zonder enige vervanging.
Deze opdracht gebruikt de -d (verwijderen) optie om elk voorkomen van “a”, “d” of “f” uit de invoerstroom te verwijderen.
echo abcdefc | tr -d 'adf'

Dit is een geval waarin we slechts één set tekens op de opdrachtregel hebben, niet twee.
Een andere is wanneer we de -s (squeeze-herhaalt) optie. Deze optie reduceert herhaalde tekens tot één enkel teken.
Dit voorbeeld reduceert herhaalde reeksen van het spatieteken tot een enkele spatie.
echo "a b c de f c" | tr -s '[:blank:]'

Het is een beetje verwarrend dat de [:blank:] token vertegenwoordigt het spatieteken en de [:space:] token vertegenwoordigt alle vormen van witruimte, inclusief tabs en newline-tekens.
In dit geval kunnen we vervangen [:blank:] met [:space:] en krijg hetzelfde resultaat.
echo "a b c de f c" | tr -s '[:space:]'

Tekens verwijderen
De verschillen tussen [:blank:] En [:space:] duidelijk worden wanneer we karakters verwijderen. Hiervoor gebruiken we de -d (verwijderen) optie, en geef een set tekens op die tr zal zoeken in zijn invoerstroom. Alles wat wordt gevonden, wordt verwijderd.
echo "a b c de f c" | tr -d '[:blank:]'

De spaties worden verwijderd. Merk op dat we een nieuwe regel krijgen nadat de uitvoerstroom in het terminalvenster is geschreven. Als we dat commando herhalen en gebruiken [:space:] in plaats van leeg, krijgen we een ander resultaat.
echo "a b c de f c" | tr -d '[:blank:]'

Deze keer beginnen we geen nieuwe regel na de uitvoer, de opdrachtprompt staat er pal tegenaan. Dit is zo omdat [:space:] bevat nieuwe regels. Alle spaties, tabs en tekens voor nieuwe regels worden uit de invoerstroom verwijderd.
Je kunt natuurlijk ook een echt spatieteken gebruiken.
echo "a b c de f c" | tr -d ' '

Cijfers kunnen we net zo gemakkelijk wissen.
echo abcd123efg | tr -d '[:digit:]'

Door het combineren van de -c (aanvulling) en -d (verwijder) opties we kunnen alles verwijderen behalve cijfers.
echo abcd123efg | tr -cd '[:digit:]'

Merk op dat alles behalve cijfers alle letters betekent, En alle witruimte, dus opnieuw verliezen we de afsluitende nieuwe regel.
Lijnen combineren en splitsen
Als we nieuwe-regeltekens vervangen door spaties, kunnen we een tekstregel splitsen en elk woord op een aparte regel plaatsen.
echo 'one two three four' | tr ' ' 'n'

We kunnen ook het scheidingsteken wijzigen dat woorden scheidt. Deze opdracht vervangt dubbele punten ” : ” voor spaties.
echo 'one two three four' | tr ' ' ':'

We kunnen elk scheidingsteken vinden dat in gebruik is en het vervangen door tekens voor nieuwe regels, waardoor moeilijk leesbare tekst wordt gesplitst in gemakkelijker te beheren uitvoer.
De omgevingsvariabele path is een lange reeks van vele directorypaden. Een dubbele punt ” : scheidt elk pad. We zullen ze veranderen in newline-tekens.
echo $PATH
echo $PATH | tr ":" "n"

Dat is veel gemakkelijker om visueel te ontleden.
Als we uitvoer hebben die we opnieuw willen opmaken in een enkele regel, kunnen we dat ook doen. Het bestand “lines.txt” bevat wat tekst, met één woord op elke regel. Dat voeren we in tr en converteer het naar een enkele regel.
cat files.txt
cat lines.txt | tr 'n' ' '

tr gebruiken met pijpen
We kunnen de uitvoer van gebruiken tr als input voor een ander programma, of zelfs voor tr zelf.
Deze opdracht gebruikt tr vier keer.
- De eerste
trverwijdert eventuele koppeltekens “-” uit de invoer. - De seconde
trdrukt herhaalde spaties samen tot enkele spaties. - De derde
trvervangt spaties door onderstrepingstekens “_”. - De vierde en laatste
trconverteert de tekenreeks naar kleine letters.
echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'

Eenvoudig is zoals eenvoudig doet
De tr commando is geweldig omdat het eenvoudig is. Er valt niet veel te leren of te onthouden. Maar zijn eenvoud kan ook zijn ondergang zijn.
Vergis je niet, dat kom je vaak tegen tr laat je doen wat je nodig hebt zonder dat je naar meer gecompliceerde tools zoals sed .
Als je echter moeite hebt om iets mee te doen tr en je merkt dat je lange daisy chains van commando’s aan het bouwen bent, die je waarschijnlijk zou moeten gebruiken sed.