Mam Terminal: Benotze Regular Expressions II: Ersatzstécker

A mir selwer fréieren Artikel Ech hunn Iech op Basisniveau gesot wéi jidd vun de meescht benotzte Spezialzeeche vu regulären Ausdréck funktionnéiert. Mat dëse regulären Ausdréck ass et méiglech komplex Recherchen an Textdateien ze maachen oder am Output vun anere Kommandoen. An dësem Artikel wäert ech erkläre wéi Dir de Kommando sed benotzt fir Text op vill méi staark Manéier ze fannen an ze ersetzen wéi einfach een Text fir en aneren z'änneren.

E bësse méi iwwer de grep Kommando

Ier ech ufänken iwwer Sed ze schwätzen, wëll ech e bësse méi iwwer de grep Kommando kommentéieren fir ze kompletéieren wat am fréiere Artikel e bësse erkläert gouf. Alles wat ech soen wäert och relevant fir dësen sinn. Méi spéit wäerte mir d'Bezéiung tëscht dësem a Recherchen gesinn.

Kombinéiere reegelméisseg Ausdréck

Vill vun de speziellen Zeechen, iwwer déi ech am virege Artikel geschwat hunn, kënne kombinéiert ginn, net nëmme mat anere Personnagen, awer mat ganz regulären Ausdréck. De Wee fir dëst ze maachen ass Klammern fir eng Ënnerexpression ze bilden. Loosst eis e Beispill vun dësem gesinn. Loosst eis ufänken en Text erofzelueden dee mir kënne benotze fir ze testen. Et ass eng Lëscht mat Ausdréck. Dofir benotze mir de folgenden Kommando:

curl http://artigoo.com/lista-de-frases-comparativas-comicas 2>/dev/null | sed -n 's/.*\(.*\.\)<\/p>/\1/gp' > frases

 Dëst léisst Iech am Verzeechnes wou Dir eng Datei mam Numm «Phrasen» start. Dir kënnt et opmaache fir et ze kucken an e bëssen ze laachen. 🙂

Loosst eis unhuelen datt mir d'Sätze fannen déi exakt 6 Wierder hunn. D'Schwieregkeet ass eng regulär Ausdrock ze bilden déi mat all Wuert passt. E Wuert ass eng Sequenz vu Buschtawen, entweder grouss oder kleng, wat eppes wier wéi '[a-zA-Z]+', awer Dir musst och präziséieren datt dës Bréiwer vun anere Charaktere wéi Bréiwer getrennt musse sinn, dat heescht, et wier eppes wéi '[a-zA-Z]+[^a-zA-Z]+'. Loosst eis drun erënneren: den "^" als éischte Charakter an de Klammern weist datt mir mat Zeeche passen déi net an de Beräicher sinn an den "+" weist 1 oder méi Zeechen un.

Mir hu schonn e reegelméissegen Ausdrock deen engem Wuert matenee kann. Fir et mat 6 ze koppelen, muss et 6 Mol widderholl ginn. Dofir hu mir d'Schlëssele benotzt, awer et ass nëtzlos ze setzen '[a-zA-Z]+[^a-zA-Z]+{6}', well d'6 de leschten Deel vum regulären Ausdrock widderhuelen a wat mir wëllen ass dat alles ze widderhuelen, also wat mir musse setzen ass dëst: '([a-zA-Z]+[^a-zA-Z]+){6}'. Mat de Klammer bilden mir en Ënnerausdrock a mat de Klameren widderhuelen mir et 6 Mol. Elo musst Dir just e "^" vir an en "$" am Réck bäisetzen fir der ganzer Linn ze passen. De Kommando ass wéi folgend:

grep -E '^([a-zA-Z]+[^a-zA-Z]+){6}$' frases

An d'Resultat ass just wat mir wollten:

Et gëtt méi gesonge wéi d'Macarena. Dir sidd méi fäerdeg wéi de Luis Aguilé. Dir hutt manner Kultur wéi e Steen. Dir wësst méi Sprooche wéi Cañita Brava. Hien huet méi Falten wéi den Tutan Khamón. Dir wësst manner wéi de Rambo iwwer Kannerbetreiung.

Bedenkt datt mir de -E Parameter setzen, well mir erweidert regulär Ausdréck benotze fir den "+" ze maachen. Wa mir déi Basis benotzt hunn, musse mir aus de Klammer an de Klameren entkommen.

Back Referenzen oder Backreferenzen

Wann Dir e Spellchecker installéiert hutt, hutt Dir wahrscheinlech eng Lëscht vu Wierder an /usr/share/dict/words. Wann net, kënnt Dir et am Arch installéieren mat:

sudo pacman -S words

Oder am Debian mat:

sudo aptitude install dictionaries-common

Wann Dir wëllt kënnt Dir d'Datei kucken a kucke wéi eng Wierder et huet. Et ass tatsächlech e Link op d'Wuertdatei fir d'Sprooch an där Är Distro ass. Dir kënnt e puer Word Dateien zur selwechter Zäit installéiert hunn.

Mir ginn dës Datei benotzen. Et stellt sech eraus datt mir ganz virwëtzeg sinn all déi siwe Buschtafspalindrome eraus ze wëssen. Fir déi, déi et net wëssen: E Palindrom ass e Capicúa Wuert, dat heescht, et kann ee vu lénks no riets wéi och vu riets no lénks gelies ginn. Loosst eis de folgenden Kommando probéieren:

grep '^\(.\)\(.\)\(.\).\3\2\1$' /usr/share/dict/words

Et gesäit e bësse komesch aus, oder? Wa mir et probéieren, hänkt d'Resultat vun der Sprooch vun Ärem Distro of an de Wierder déi an Ärer Lëscht sinn, awer a mengem Fall mat der spuenescher Sprooch ass d'Resultat dëst:

aniline aniline rullt

Loosst eis kucken wéi dëse regulären Ausdrock funktionnéiert.

Ausser dem "^" an "$", fir dee mer scho wësse wat et ass, ass dat éischt wat mer lénks gesinn dräi Gruppe vu Punkten an enger Klammer. Gitt net verwiesselt vun de Barren virun all Parenthèse. Si sollen de Klammer entkommen well mir benotze Basis regulär Ausdréck, awer si hu keng aner Bedeitung. Déi wichteg Saach ass datt mir no dräi Zeeche mat de Punkte froen, awer all eenzel vun dëse Punkte sinn an parentheses zou. Dëst ass fir d'Charaktere ze späicheren déi mat dëse Punkte passen, sou datt se erëm aus dem regulären Ausdrock referenzéiert kënne ginn. Dëst ass eng aner Benotzung vu Klammer déi spéider praktesch kommen fir Ersatzstécker ze maachen.

Dëst ass wou déi dräi Zuelen hei ënnendrënner mat dem Schräif virun hinne kommen. An dësem Fall ass d'Bar wichteg. Et gëtt benotzt fir unzeginn datt d'Nummer hei ënnendrënner eng Réckreferenz ass a bezitt sech op eng vun de fréiere Klammer. Zum Beispill: \ 1 bezitt sech op déi éischt Klammer, \ 2 op déi zweet, asw.

An anere Wierder, mat der regulärer Ausdrock déi mir gesat hunn, wat mir gesicht hunn, sinn all d'Wierder déi mat véier Buschtawen ufänken an dann e Buschtaf hunn deen d'selwecht ass wéi den Drëtten, een aneren deen d'selwecht ass wéi deen zweeten an deen aneren deen d'selwecht ass éischten. D'Resultat ass déi siwe Buschtafspalindrome, déi an der Wuertlëscht sinn. Just wéi mir wollten.

Wa mir ausgedehnt Regulär Ausdréck benotzt, musse mir net aus den Klammer erauskommen, awer mat ausgedehnten regulären Ausdréck funktionéieren d'Backreferenzen net an alle Programmer well se net standardiséiert sinn. Wéi och ëmmer, mat Grep funktionnéieren se, sou datt et en anere Wee ka sinn fir datselwecht ze maachen. Dir kënnt et probéieren wann Dir wëllt.

Ersatzausdréck: de Kommando sed

Nieft der Sich ass ee vun de beschten Utilisatioune vu reegelméissegen Ausdréck fir komplex Texter ze ersetzen. Fir dëst ze maachen, ass e Wee et mam Sed Kommando. D'Kraaft vum Sed Kommando geet wäit wéi den Ersatz vum Text, awer hei wäert ech et dofir benotzen. D'Syntax déi ech mat dësem Kommando benotze wäert ass déi folgend:

sed [-r] 's/REGEX/REPL/g' FICHERO

Oder och:

COMANDO | sed [-r] 's/REGEX/REPL/g'

Wou REGEX d'Sich regelméisseg Ausdrock ass an den Ersatz ersetzt. Denkt drun datt dëst Kommando net wierklech eppes an der Datei ersetzt déi mir uginn, awer wat et mécht ass eis d'Resultat vum Ersatz am Terminal ze weisen, also sidd net Angscht virun de Kommandoen déi ech niewendrun setzen. Keen vun hinnen ännert Dateien op Ärem System.

Loosst eis mat engem einfachen Beispill ufänken. Mir hunn all verschidde Konfiguratiounsdateien am / etc Verzeechnes déi normalerweis Kommentaren hunn mat "#". Stellt Iech vir datt mir eng vun dësen Dateien ouni d'Kommentare gesinn. Zum Beispill wäert ech et mam fstab maachen. Dir kënnt mat deem probéieren deen Dir wëllt.

sed 's/#.*//g' /etc/fstab

Ech wäert d'Resultat vum Kommando net hei setzen well et hänkt dovun of wat Dir an Ärem fstab hutt, awer wann Dir d'Ausgab vum Kommando mam Inhalt vun der Datei vergläicht, gesitt Dir datt all d'Kommentarer verschwonnen sinn.

An dësem Kommando ass d'Sichausdréck «#.*", Dat ass en" # "gefollegt vun enger Zuel vu Personnagen, dat heescht d'Kommentaren. An den Ersatzausdrock, wann Dir déi zwee Baren hannertenee kuckt, da gesitt Dir datt et keng gëtt, also wat et mécht ass d'Kommentaren duerch näischt ze ersetzen, dat heescht se ze läschen. Méi einfach onméiglech.

Elo maache mir de Géigendeel. Stellt Iech vir, datt wat mir wëllen ass all d'Zeilen vun der Datei ze kommentéieren. Probéiere mir esou:

sed 's/^/# /g' /etc/fstab

Dir gesitt datt an der Ausgab vum Kommando all d'Linnen mat engem Hashmark an eidelem Raum ufänken. Wat mir gemaach hunn ass den Ufank vun der Zeil ersat duerch «# «. Dëst ass och e relativ einfacht Beispill wou den Text deen ersat gëtt ëmmer déiselwecht ass, awer elo wäerte mir e bësse méi komplizéieren.

D'Gnod vun Ersatzstécker ass datt Dir am Ersatzausdrock Réckverweisunge benotze kënnt wéi déi, déi ech Iech virdru gesot hunn. Loosst eis zréck op d'Sazdatei déi mir am Ufank vum Artikel erofgelueden hunn. Mir setzen an d'Klammer all déi grouss Buschtawen déi et gëtt, awer mir maachen et mat engem Kommando:

sed 's/\([A-Z]\)/(\1)/g' frases

Wat mir hei hunn ass eng Réckreferenz am Ersatzausdrock deen op d'Klammern am Sichausdrock bezitt. D'Klammer am Ersatzausdrock si normal Klammer. Am Ersatzausdrock hu se keng speziell Bedeitung, si gi sou gesat. D'Resultat ass datt all grouss Buschtawen duerch dee selwechte Buschtaf ersat ginn, egal wéi et ass, mat Klammer ronderëm.

Et gëtt en anere Charakter deen och am Ersatzausdrock ka benotzt ginn, et ass "&" an et gëtt ersat duerch all den Text mat der Sichausdréck. E Beispill dofir kéint sinn all Sätz an der Datei an Zitater ze setzen. Dëst ka mat dësem Kommando erreecht ginn:

sed 's/.*/"&"/g' frases

D'Operatioun vun dësem Kommando ass ganz ähnlech wéi déi virdrun, nëmmen elo wat mir ersetzen ass déi ganz Linn mat der selwechter Linn mat Zitater ronderëm. Well mir "&" benotzen, brauche mir keng Klammern ze setzen.

E puer nëtzlech Befehle mat regelméissegen Ausdréck

Hei sinn e puer Befehle déi ech nëtzlech oder virwëtzeg fannen an déi regelméisseg Ausdréck benotzen. Mat dësen Kommandoen ass d'Utilitéit vun de regulären Ausdréck vill besser wéi mat de Beispiller déi ech Iech bis elo ginn hunn, awer et schéngt mir wichteg eppes z'erklären iwwer wéi regulär Ausdréck funktionnéieren fir se ze verstoen.

  • Weist Ofschnëtter vun enger Mann Säit:

man bash | grep '^[A-Z][A-Z ]*$'

Natierlech kënnt Dir de Bash Kommando änneren op wat Dir wëllt. An da vum Mënsch, kënnt Dir direkt an d'Sektioun goen, déi Iech interesséiert, natierlech, e regelméissegen Ausdrock. Dir dréckt «/» fir ze sichen a schreiwen «^ALIASES$»Zum Beispill an d'Sektioun ALIASES ze goen. Ech denken dat ass deen éischte Gebrauch deen ech ugefaang hunn mat reegelméissegen Ausdréck virun e puer Joer ze maachen. Duerch verschidde Säite vum Handbuch ze réckelen ass bal onméiglech ouni en Trick wéi dësen.

  • Weist d'Nimm vun all de Benotzer vun der Maschinn mat speziellen:

sed 's/\([^:]*\).*/\1/' /etc/passwd

  • Weist Benotzernimm, awer nëmmen déi mat Shell:

grep -vE '(/false|/nologin)$' /etc/passwd | sed 's/\([^:]*\).*/\1/g'

Et kann wierklech mat engem eenzegen regulären Ausdrock gemaach ginn, awer de Wee et ze maachen geet méi wäit wéi ech Iech an dësen Artikelen gesot hunn, also hunn ech et gemaach andeems Dir zwee Befehle kombinéiert.

  • Setzt e Komma virun de leschten dräi Ziffere vun allen Zuelen an der Nummerendatei:

sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' numbers

Et funktionnéiert nëmme mat Zuelen bis zu 6 Zifferen, awer et ka méi wéi eemol genannt ginn fir Trenneren an déi aner Gruppen vun dräi Zifferen ze placéieren.

  •  Extraitéiert all E-Mail Adressen aus enger Datei:

grep -E '\<[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\>' FICHERO

  • Trennt den Dag, de Mount an d'Joer vun all den Datumen déi an engem Fichier erschéngen:

sed -r 's/([0-9]{2})[/-]([0-9]{2})[/-]([0-9]{4})/Día: \1, Mes: \2, Año: \3/g' FICHERO

  • Fannt eis lokal IP eraus:

/sbin/ifconfig | grep 'inet .*broadcast' | sed -r 's/[^0-9]*(([0-9]+\.){3}[0-9]+).*/\1/g'

Dëst kann och mat engem eenzege Sed Kommando gemaach ginn, awer ech trennen et besser an e Grep an e Sed fir Einfachheet.

E puer nëtzlech Adressen

Hei sinn e puer Adressen déi nëtzlech kënne sinn am Zesummenhang mat regulären Ausdréck:

  • Regelméisseg Ausdrock Bibliothéik: Dëst ass eng Regular Expressioun Bibliothéik an där Dir no Regular Ausdréck am Zesummenhang mam Thema kënnt dat Iech interesséiert Fir no Web Adressen, ID oder wéi och ëmmer ze sichen.
  • RegExr: En Online Regelméissegen Ausdrock Checker. Et erlaabt Iech en Text anzeginn an e reegelméissegen Ausdrock dozou ze sichen entweder ze sichen oder ze ersetzen. Et gëtt Informatioun iwwer de regulären Ausdrock an Dir hutt e puer Optiounen fir säi Verhalen z'änneren.
  • Regelméisseg Ausdréck Tester: Et ass en Zousaz fir Firefox déi et erlaabt regelméisseg Ausdréck aus dem Browser ze kontrolléieren.

Konklusioun

Fir elo ass dat alles. Regelméisseg Ausdréck si komplex awer nëtzlech. Et brauch Zäit se ze léieren, awer wann Dir wéi ech sidd, da spillt mat hinne Spaass an, lues a lues wäert Dir se beherrschen. Et ass eng ganz Welt. Et wier nach vill ze soen, iwwer liddereg Quantifiers, PERL-Stil Regex, Multiline, asw. An dann huet all Programm seng Charakteristiken a seng Varianten, also de beschte Rot deen ech Iech ka ginn ass ëmmer d'Dokumentatioun vum Programm ze kucken deen Dir benotzt all Kéier wann Dir e reegelméissegen Ausdrock an engem neie Programm musst schreiwen.

Hey! ... HEI! … ERWÄCHEN! ... WAT SINN DIR ALL SCHLAPPT? 🙂

Fuentes

E puer vun den Iddien a Beispiller fir reegelméisseg Ausdréck an dësem Artikel hunn ech vun hei geholl:


Den Inhalt vum Artikel hält sech un eis Prinzipie vun redaktionnell Ethik. Fir e Feeler ze mellen klickt hei.

15 Kommentaren, loosst ären

Gitt Äre Kommentar

Är Email Adress gëtt net publizéiert ginn. Néideg Felder sinn markéiert mat *

*

*

  1. Responsabel fir d'Daten: Miguel Ángel Gatón
  2. Zweck vun den Donnéeën: Kontroll SPAM, Kommentarmanagement.
  3. Legitimatioun: Är Zoustëmmung
  4. Kommunikatioun vun den Donnéeën: D'Donnéeë ginn net un Drëttubidder matgedeelt ausser duerch legal Verpflichtung.
  5. Datenspeicher: Datebank gehost vun Occentus Networks (EU)
  6. Rechter: Zu all Moment kënnt Dir Är Informatioun limitéieren, recuperéieren an läschen.

  1.   elav sot

    Meeschterlech !!!

    1.    hexborg sot

      Et ass net sou schlëmm, awer villmools Merci. Hoffen d'Leit hunn et gär. 🙂

      1.    Oscar sot

        Gefällt mer ha!

        1.    hexborg sot

          Dann muss ech eppes richteg gemaach hunn. LOL!! 🙂

          Villmools Merci fir Äre Kommentar.

          1.    Blaire pascal sot

            Féck weider schreift Mann, weider esou.

          2.    hexborg sot

            @Blaire Pascal: Kommentarer wéi ären encouragéieren et. 🙂 Villmools Merci !!

      2.    Citux sot

        Gefällt mir och ... merci 🙂

        1.    hexborg sot

          Merci fir de Kommentar. Ech hoffen e puer méi ze schreiwen. 🙂

  2.   mariano sot

    Är Posts si fantastesch, Dir léiert vill, éischter, Dir léiert Aufgaben op eng elegant an effizient Manéier auszeféieren.

    Hutt Dir geduecht all Är Shell Skript Posts ze sammelen? An e PDF sortéiert wier e super Handbuch.

    Prost a villmools Merci!

    1.    hexborg sot

      Villmols Merci!! Et ass keng schlecht Iddi. De Moment sinn et nëmmen zwee, awer ech wäert méi spéit doriwwer nodenken. 🙂

  3.   Kiyov sot

    ganz gudden Artikel, 5+.

    1.    hexborg sot

      Merci. Ech si frou datt Dir et gär hutt. 🙂

  4.   sebastian sot

    Exzellent! Ech muss de folgenden Ausdrock änneren an ech weess net wéi ech et maache soll:
    192.168.0.138/Server vun 192.168.0.111/data
    De Problem läit am "/" Symbol.
    Ech benotzen de Kommando:
    fannen. -numm "* .txt" -exec sed -i 's / TEXT1 / TEXT2 / g' {} \;
    Wat gëtt benotzt fir dës Aart Aufgaben remissiv auszeféieren, awer ech kann net ...
    Weess een wéi ech et soll maachen?
    Kram!
    Seba

    1.    hexborg sot

      Wat Dir maache musst ass dem Personnage esou ze entkommen:

      fannen. -numm "* .txt" -exec sed -i 's / \ / Server / \ / data / g' {} \;

      Dir kënnt och en aneren Separator am Sed benotzen. Et muss keng Bar sinn. Sed erlaabt all Charakter ze benotzen. Zum Beispill wier dëst méi kloer:

      fannen. -name "* .txt" -exec sed -i 's | / Server | / data | g' {} \;

      A wann Dir d'Befehle vun dësem Kommentar kopéiert a pecht, passt op d'Zitatzeechen, datt d'Wordpress se fir déi typographesch ännert. 🙂

      Merci.

  5.   sebastian sot

    Exzellent !!!!
    Ech hu laang no dëser Léisung gesicht.
    Hei verloossen ech de komplette Kommando deen ech benotzt hunn

    fannen. -name "* .txt" -exec sed -i 's | 192 \ .168 \ .0 \ .238 \ / Server | 192 \ .168 \ .0 \ .111 \ / data | g' {} \;

    De Virdeel vun dësem Kommando ass datt et all .txt Dateien (oder déi Extensioun déi Dir wëllt) rekursiv ännert ... Dir musst ganz virsiichteg sinn!
    Awer et ass ganz nëtzlech !!!

    Gutt, merci fir alles an dausend Félicitatiounen un de ganze Grupp.
    Ech liesen se ëmmer vun der Mail!
    Knuffelen
    Seba