Hoe het Linux tr-commando te gebruiken

Hoe het Linux tr-commando te gebruiken
Jordan Gloor / How-To Geek
De opdracht tr voert transformaties uit op een tekststroom en produceert een nieuwe stroom als uitvoer. U kunt tekens vervangen, verwijderen of converteren volgens de regels die u op de opdrachtregel instelt.

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.

Inhoudsopgave

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'

Een enkel teken vervangen door tr

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'

Twee letters verwijderen met tr

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'

Ongebalanceerde tekenreeksen gebruiken met tr

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'

Ongebalanceerde tekenreeksen gebruiken met tr met de afkappen-optie

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]'

Tekenreeksen gebruiken om een ​​tekenreeks om te zetten in hoofdletters

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]'

Tekenreeksen gebruiken om een ​​tekenreeks om te zetten in kleine letters

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:]'

Tokens gebruiken om het hoofdlettergebruik van tekenreeksen te wijzigen

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' '-'

Alle behalve de opgegeven tekens vervangen door andere tekens

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' '-'

Alle behalve de opgegeven meerdere tekens vervangen door andere tekens

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'

Meerdere tekens uit een tekstreeks verwijderen met tr

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:]'

Herhalende tekenreeksen veranderen in een enkel voorkomen van het teken, met tr

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:]'

Herhalende tekenreeksen veranderen in een enkel voorkomen van het teken, met tr

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:]'

Spaties (spatietekens) verwijderen uit een reeks tekst, met tr

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:]'

Witruimte verwijderen uit een reeks tekst, met tr

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 ' '

Spaties verwijderen uit een tekstreeks door een spatie op te geven met tr

Cijfers kunnen we net zo gemakkelijk wissen.

echo abcd123efg | tr -d '[:digit:]'

Cijfers uit een tekstreeks verwijderen met tr

Door het combineren van de -c (aanvulling) en -d (verwijder) opties we kunnen alles verwijderen behalve cijfers.

echo abcd123efg | tr -cd '[:digit:]'

Alles behalve cijfers uit een tekstreeks verwijderen met tr

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'

Een regel tekst opsplitsen in één woord per regel, met tr

We kunnen ook het scheidingsteken wijzigen dat woorden scheidt. Deze opdracht vervangt dubbele punten ” : ” voor spaties.

echo 'one two three four' | tr ' ' ':'

Het woordscheidingsteken wijzigen van spaties naar dubbele punten, met 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"

De omgevingsvariabele $PATH splitsen in afzonderlijke mappaden, één per regel, met tr

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' ' '

Combineren van invoer van meerdere regels tot een enkele regel tekst, met behulp van tr

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 tr verwijdert eventuele koppeltekens “-” uit de invoer.
  • De seconde tr drukt herhaalde spaties samen tot enkele spaties.
  • De derde tr vervangt spaties door onderstrepingstekens “_”.
  • De vierde en laatste tr converteert de tekenreeks naar kleine letters.
echo "Mangled FiLE-nAMe.txt" | tr -d '-' | tr -s ' ' | tr ' ' '_' | tr '[:upper:]' '[:lower:]'

Een pijplijn van vier instanties van tr

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 .

Hoe het sed-commando op Linux te gebruiken

VERWANTHoe het sed-commando op Linux te gebruiken

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.

Nieuwste artikelen

Gerelateerde artikelen