Με τερματικό: Χρήση κανονικών εκφράσεων

Ένα από τα πράγματα που μου άρεσαν πάντα για το τερματικό Linux είναι αυτό που μπορείτε να επιτύχετε χρησιμοποιώντας κανονικές εκφράσεις. Είτε πρέπει να βρούμε περίπλοκο κείμενο είτε να το αντικαταστήσουμε με κάτι άλλο, η χρήση κανονικών εκφράσεων μπορεί να απλοποιήσει σημαντικά την εργασία. Ας ξεκινήσουμε από την αρχή:

ΠΡΟΕΙΔΟΠΟΙΗΣΗ: Αυτή η ανάρτηση είναι πόνος στον κώλο. Η ανάγνωση αυτής της ανάρτησης συνεχώς μπορεί να προκαλέσει απώλεια συνείδησης. Κάντε διαλείμματα στο μεταξύ ή ρωτήστε το γιατρό ή το φαρμακοποιό σας πριν διαβάσετε ολόκληρη την ανάρτηση.

Τι είναι μια κανονική έκφραση;

Μια κανονική έκφραση είναι μια σειρά ειδικών χαρακτήρων που μας επιτρέπουν να περιγράψουμε ένα κείμενο που θέλουμε να βρούμε. Για παράδειγμα, αν θέλαμε να αναζητήσουμε τη λέξη "linux", αρκεί να βάλουμε τη λέξη στο πρόγραμμα που χρησιμοποιούμε. Η ίδια η λέξη είναι μια κανονική έκφραση. Μέχρι στιγμής φαίνεται πολύ απλό, αλλά τι γίνεται αν θέλουμε να βρούμε όλους τους αριθμούς σε ένα συγκεκριμένο αρχείο; Ή όλες οι γραμμές που ξεκινούν με κεφαλαίο γράμμα; Σε αυτές τις περιπτώσεις δεν μπορείτε πλέον να βάλετε μια απλή λέξη. Η λύση είναι να χρησιμοποιήσετε μια κανονική έκφραση.

Κανονικές εκφράσεις έναντι μοτίβων αρχείων.

Προτού μπω σε κανονικές εκφράσεις, θέλω να ξεκαθαρίσω μια κοινή παρανόηση σχετικά με τις κανονικές εκφράσεις. Μια κανονική έκφραση δεν είναι αυτό που θέτουμε ως παράμετρος σε εντολές όπως rm, cp κ.λπ. για να αναφερθούμε σε διάφορα αρχεία στον σκληρό δίσκο. Αυτό θα ήταν ένα μοτίβο αρχείου. Οι κανονικές εκφράσεις, παρόλο που είναι παρόμοιες στο ότι χρησιμοποιούν ορισμένους κοινούς χαρακτήρες, είναι διαφορετικές. Ένα μοτίβο αρχείου ενεργοποιείται στα αρχεία του σκληρού δίσκου και επιστρέφει αυτά που ταιριάζουν απόλυτα με το μοτίβο, ενώ μια κανονική έκφραση ενεργοποιείται σε ένα κείμενο και επιστρέφει τις γραμμές που περιέχουν το κείμενο που αναζητήθηκε. Για παράδειγμα, η κανονική έκφραση που αντιστοιχεί στο μοτίβο *.* θα ήταν κάτι σαν ^.*\..*$

Τύποι τυπικών εκφράσεων.

Δεν χρησιμοποιούν όλα τα προγράμματα τις ίδιες κανονικές εκφράσεις. Όχι πολύ λιγότερο. Υπάρχουν αρκετοί λίγοι τυπικοί τύποι τυπικών εκφράσεων, αλλά υπάρχουν προγράμματα που αλλάζουν ελαφρώς τη σύνταξη, περιλαμβάνουν τις δικές τους επεκτάσεις ή ακόμη και χρησιμοποιούν εντελώς διαφορετικούς χαρακτήρες. Επομένως, όταν θέλετε να χρησιμοποιήσετε κανονικές εκφράσεις με ένα πρόγραμμα που δεν γνωρίζετε καλά, το πρώτο πράγμα που πρέπει να κάνετε είναι να δείτε το εγχειρίδιο ή την τεκμηρίωση του προγράμματος για να δείτε πώς είναι οι κανονικές εκφράσεις που αναγνωρίζει.

Πρώτον, υπάρχουν δύο κύριοι τύποι κανονικών εκφράσεων, οι οποίες περιέχονται στο πρότυπο POSIX, το οποίο χρησιμοποιούν τα εργαλεία Linux. Είναι οι βασικές και εκτεταμένες τακτικές εκφράσεις. Πολλές από τις εντολές που λειτουργούν με κανονικές εκφράσεις, όπως grep ή sed, σας επιτρέπουν να χρησιμοποιήσετε αυτούς τους δύο τύπους. Θα τους μιλήσω παρακάτω. Υπάρχουν επίσης οι τυπικές εκφράσεις τύπου PERL και, στη συνέχεια, υπάρχουν προγράμματα όπως vim ή emacs που χρησιμοποιούν παραλλαγές αυτών. Ανάλογα με το τι θέλουμε να κάνουμε, μπορεί να είναι πιο κατάλληλο να χρησιμοποιήσετε το ένα ή το άλλο.

Δοκιμή κανονικών εκφράσεων.

Η σύνταξη των τυπικών εκφράσεων δεν είναι τίποτα ασήμαντο. Όταν πρέπει να γράψουμε μια περίπλοκη τακτική έκφραση, θα είμαστε μπροστά σε μια σειρά ειδικών χαρακτήρων που είναι αδύνατο να καταλάβουμε με την πρώτη ματιά, οπότε για να μάθουμε πώς να τους χρησιμοποιήσουμε είναι απαραίτητο να έχουμε έναν τρόπο να κάνουμε όλες τις δοκιμές που θέλουμε και να βλέπουμε τα αποτελέσματα εύκολα. Αυτός είναι ο λόγος για τον οποίο πρόκειται να βάλω πολλές εντολές με τις οποίες μπορούμε να κάνουμε τις δοκιμές και να πειραματιστούμε ό, τι χρειαζόμαστε έως ότου κυριαρχούν οι κανονικές εκφράσεις.

Το πρώτο είναι η εντολή grep. Αυτή είναι η εντολή που θα χρησιμοποιούμε πιο συχνά για να κάνουμε αναζητήσεις. Η σύνταξη έχει ως εξής:

grep [-E] 'REGEX' FICHERO
COMANDO | grep [-E] 'REGEX'

Συνιστώ να τοποθετείτε πάντα κανονικές εκφράσεις σε μεμονωμένα εισαγωγικά, έτσι ώστε το κέλυφος να μην μας τρελαίνει. Ο πρώτος τρόπος είναι να βρείτε μια κανονική έκφραση σε ένα αρχείο. Το δεύτερο επιτρέπει το φιλτράρισμα της εξόδου μιας εντολής μέσω μιας κανονικής έκφρασης. Από προεπιλογή, το grep χρησιμοποιεί βασικές τυπικές εκφράσεις. Η επιλογή -E είναι για τη χρήση εκτεταμένων κανονικών εκφράσεων.

Ένα τέχνασμα που μπορεί να μας βοηθήσει να δούμε πώς λειτουργούν οι κανονικές εκφράσεις, επιτρέποντας τη χρήση χρώματος στην εντολή grep. Με αυτόν τον τρόπο, θα επισημανθεί το τμήμα του κειμένου που ταιριάζει με την κανονική έκφραση που χρησιμοποιούμε. Για να ενεργοποιήσετε το χρώμα στην εντολή grep, βεβαιωθείτε ότι η μεταβλητή περιβάλλοντος GREP_OPTIONS περιέχουν αξία --color, η οποία μπορεί να γίνει με αυτήν την εντολή:

GREP_OPTIONS=--color

Μπορούμε να το βάλουμε στο .bashrc για να το έχουμε πάντα ενεργοποιημένο.

Ένας άλλος τρόπος για να χρησιμοποιήσετε κανονικές εκφράσεις είναι χρησιμοποιώντας την εντολή sed. Αυτό είναι πιο κατάλληλο για την αντικατάσταση κειμένου, αλλά μπορεί επίσης να χρησιμοποιηθεί για αναζήτηση. Η σύνταξη για αυτό θα ήταν έτσι:

sed -n[r] '/REGEX/p' FICHERO
COMANDO | sed -n[r] '/REGEX/p'

Η εντολή sed χρησιμοποιεί επίσης βασικές κανονικές εκφράσεις από προεπιλογή, μπορείτε να χρησιμοποιήσετε εκτεταμένες κανονικές εκφράσεις με την επιλογή -r.

Μια άλλη εντολή που θέλω επίσης να ονομάσω είναι awk. Αυτή η εντολή μπορεί να χρησιμοποιηθεί για πολλά πράγματα, καθώς σας επιτρέπει να γράφετε σενάρια στη δική σας γλώσσα προγραμματισμού. Εάν αυτό που θέλουμε είναι να βρούμε μια κανονική έκφραση σε ένα αρχείο ή στην έξοδο μιας εντολής, ο τρόπος χρήσης της θα ήταν ο εξής:

awk '/REGEX/' FICHERO
COMANDO | awk '/REGEX/'

Αυτή η εντολή χρησιμοποιεί πάντα εκτεταμένες κανονικές εκφράσεις.

Για να πραγματοποιήσουμε τις δοκιμές μας, θα χρειαστούμε επίσης ένα κείμενο που θα χρησιμεύσει ως παράδειγμα για την αναζήτηση. Μπορούμε να χρησιμοποιήσουμε το ακόλουθο κείμενο:

- Lista de páginas wiki:

ArchLinux: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/

- Fechas de lanzamiento:

Arch Linux: 11-03-2002
Gentoo: 31/03/2002
CentOs: 14-05-2004 03:32:38
Debian: 16/08/1993
Ubuntu: 20/10/2004

Desde Linux Rulez.

Αυτό είναι το κείμενο που θα χρησιμοποιήσω για τα παραδείγματα της υπόλοιπης ανάρτησης, γι 'αυτό σας προτείνω να το αντιγράψετε σε ένα αρχείο για να το έχετε διαθέσιμο από το τερματικό. Μπορείτε να βάλετε το όνομα που θέλετε. Το ονόμασα regex.

Έναρξη μαθήματος.

Τώρα έχουμε ό, τι χρειαζόμαστε για να αρχίσουμε να δοκιμάζουμε κανονικές εκφράσεις. Πάμε λίγο-λίγο. Πρόκειται να βάλω πολλά παραδείγματα αναζητήσεων με κανονικές εκφράσεις στις οποίες θα εξηγήσω τι είναι κάθε χαρακτήρας. Δεν είναι πολύ καλά παραδείγματα, αλλά επειδή θα έχω μια πολύ μεγάλη ανάρτηση, δεν θέλω να την περιπλέξω πια. Και απλά θα χαράξω την επιφάνεια του τι μπορεί να γίνει με κανονικές εκφράσεις.

Το απλούστερο από όλα είναι να αναζητήσετε μια συγκεκριμένη λέξη, για παράδειγμα, ας υποθέσουμε ότι θέλουμε να αναζητήσουμε όλες τις γραμμές που περιέχουν τη λέξη "Linux". Αυτό είναι το πιο εύκολο, αφού πρέπει να γράψουμε μόνο:

grep 'Linux' regex

Και μπορούμε να δούμε το αποτέλεσμα:

αψίδαLinux: https://wiki.archlinux.org/ Arch Linux: 11-03-2002 Από Linux Rulez.

Αυτές είναι οι τρεις γραμμές που περιέχουν τη λέξη "Linux" οι οποίες, εάν έχουμε χρησιμοποιήσει το κόλπο χρώματος, θα εμφανίζονται επισημασμένες. Σημειώστε ότι αναγνωρίζει τη λέξη που αναζητάμε ακόμη και αν είναι μέρος μιας μεγαλύτερης λέξης όπως στο "ArchLinux". Ωστόσο, δεν επισημαίνει τη λέξη "linux" που εμφανίζεται στη διεύθυνση URL "https://wiki.archlinux.org/". Αυτό συμβαίνει επειδή εμφανίζεται εκεί με τα πεζά γράμματα "l" και το έχουμε ψάξει με κεφαλαία γράμματα. Η εντολή grep έχει επιλογές για αυτό, αλλά δεν πρόκειται να τους μιλήσω σε ένα άρθρο σχετικά με τις κανονικές εκφράσεις.

Με αυτό το απλό τεστ μπορούμε να βγάλουμε το πρώτο συμπέρασμα:

  • Ένας κανονικός χαρακτήρας που τοποθετείται σε μια κανονική έκφραση ταιριάζει από μόνος του.

Που σημαίνει ότι αν βάλετε το γράμμα "a" θα αναζητήσει το γράμμα "a". Φαίνεται λογικό, σωστά; 🙂

Ας υποθέσουμε ότι θέλουμε να αναζητήσουμε τη λέξη "CentO" ακολουθούμενη από οποιονδήποτε χαρακτήρα, αλλά μόνο έναν χαρακτήρα. Για αυτό μπορούμε να χρησιμοποιήσουμε τον χαρακτήρα ".", Που είναι ένα μπαλαντέρ που ταιριάζει με οποιονδήποτε χαρακτήρα, αλλά μόνο έναν:

grep 'CentO.' regex

Και το αποτέλεσμα είναι:

CentOS: http://wiki.centos.org/
σεντ: 14-05-2004 03:32:38

Αυτό σημαίνει ότι περιλαμβάνει το "S" στο "CentOS" αν και σε μια περίπτωση είναι κεφαλαίο και σε άλλη πεζά. Εάν εμφανιστεί κάποιος άλλος χαρακτήρας σε αυτό το μέρος, θα τον συμπεριλάμβανε επίσης. Έχουμε ήδη τον δεύτερο κανόνα:

  • Ο χαρακτήρας "." ταιριάζει με οποιονδήποτε χαρακτήρα.

Δεν είναι πλέον τόσο ασήμαντο όσο φαινόταν, αλλά με αυτό δεν μπορούμε να κάνουμε πολλά. Ας πάμε λίγο πιο μακριά. Ας υποθέσουμε ότι θέλουμε να βρούμε τις γραμμές στις οποίες εμφανίζονται το έτος 2002 και 2004. Φαίνονται σαν δύο αναζητήσεις, αλλά μπορούν να γίνουν ταυτόχρονα έτσι:

grep '200[24]' regex

Αυτό σημαίνει ότι θέλουμε να βρούμε τον αριθμό 200 ακολουθούμενο από 2 ή 4. Και το αποτέλεσμα είναι αυτό:

ArchLinux: 11-03-2002
Gentoo: 31/03 /2002
CentOS: 14-05-2004 03:32:38
Ubuntu: 20/10/2004

Αυτό μας φέρνει στον τρίτο κανόνα:

  • Πολλοί χαρακτήρες που περικλείονται σε αγκύλες ταιριάζουν με οποιονδήποτε από τους χαρακτήρες εντός των αγκυλών.

Οι αγκύλες δίνουν περισσότερο παιχνίδι. Μπορούν επίσης να χρησιμοποιηθούν για τον αποκλεισμό χαρακτήρων. Για παράδειγμα, ας υποθέσουμε ότι θέλουμε να αναζητήσουμε ιστότοπους όπου εμφανίζεται ο χαρακτήρας ":", αλλά δεν ακολουθείται από το "/". Η εντολή θα ήταν έτσι:

grep ':[^/]' regex

Είναι απλώς θέμα τοποθέτησης του "^" ως του πρώτου χαρακτήρα μέσα στην αγκύλη. Μπορείτε να βάλετε όλους τους χαρακτήρες που θέλετε παρακάτω. Το αποτέλεσμα αυτής της τελευταίας εντολής είναι το ακόλουθο:

ArchLinux: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/
Arch Linux: 11-03-2002 Gentoo: 31/03/2002 CentOs: 14-05-2004 03:32:38 Debian: 16/08/1993 Ubuntu: 20/10/2004

Τώρα επισημαίνονται τα ":" πίσω από τα ονόματα διανομής, αλλά όχι αυτά στα URL, επειδή τα URL έχουν "/" μετά από αυτά.

  • Η τοποθέτηση του χαρακτήρα "^" στην αρχή μιας αγκύλης ταιριάζει με οποιονδήποτε χαρακτήρα εκτός από τους άλλους χαρακτήρες στην αγκύλη.

Ένα άλλο πράγμα που μπορούμε να κάνουμε είναι να καθορίσουμε μια σειρά χαρακτήρων. Για παράδειγμα, για να αναζητήσετε οποιονδήποτε αριθμό ακολουθούμενο από ένα "-" θα μοιάζει με αυτό:

grep '[0-9]-' regex

Με αυτό καθορίζουμε έναν χαρακτήρα μεταξύ 0 και 9 και στη συνέχεια ένα σύμβολο μείον. Ας δούμε το αποτέλεσμα:

ArchLinux: 11-03-2002 CentOs: 14-05-2004 03: 32: 38

Μπορούν να καθοριστούν πολλαπλά εύρη εντός των αγκυλών, ώστε να συνδυάζονται ομοιόμορφα εύρη με μεμονωμένους χαρακτήρες.

  • Η τοποθέτηση δύο χαρακτήρων διαχωρισμένων με "-" εντός των παρενθέσεων ταιριάζει με οποιονδήποτε χαρακτήρα εντός του εύρους.

Ας δούμε τώρα αν μπορούμε να επιλέξουμε το πρώτο μέρος των διευθύνσεων URL. Αυτό που λέει "http" ή "https". Διαφέρουν μόνο στο τελικό "s", οπότε ας το κάνουμε ως εξής:

grep -E 'https?' regex

Το ερωτηματικό χρησιμοποιείται για να κάνει τον χαρακτήρα στα αριστερά του προαιρετικό. Αλλά τώρα έχουμε προσθέσει την επιλογή -E στην εντολή. Αυτό συμβαίνει επειδή η ανάκριση είναι μια δυνατότητα εκτεταμένων τακτικών εκφράσεων. Μέχρι τώρα χρησιμοποιούσαμε βασικές τυπικές εκφράσεις, οπότε δεν χρειαζόμασταν τίποτα. Ας δούμε το αποτέλεσμα:

ArchLinux: https: //wiki.archlinux.org/ Gentoo: https: //wiki.gentoo.org/wiki/Main_Page CentOS: http: //wiki.centos.org/ Debian: https: //wiki.debian.org/ Ubuntu: https: //wiki.ubuntu.com/

Έχουμε ήδη έναν νέο κανόνα:

  • Ένας χαρακτήρας που ακολουθείται από το "?" ταιριάζει με αυτόν τον χαρακτήρα ή κανένα. Αυτό ισχύει μόνο για εκτεταμένες κανονικές εκφράσεις.

Τώρα πρόκειται να αναζητήσουμε δύο εντελώς διαφορετικές λέξεις. Ας δούμε πώς να βρούμε τις γραμμές που περιέχουν τόσο τη λέξη "Debian" όσο και το "Ubuntu".

grep -E 'Debian|Ubuntu' regex

Με την κάθετη γραμμή μπορούμε να διαχωρίσουμε δύο ή περισσότερες διαφορετικές κανονικές εκφράσεις και να αναζητήσουμε τις γραμμές που ταιριάζουν με οποιαδήποτε από αυτές:

Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/
Debian: 16 / 08 / 1993
Ubuntu: 20 / 10 / 2004
  • Ο χαρακτήρας "|" χρησιμεύει στο διαχωρισμό αρκετών τακτικών εκφράσεων και αντιστοιχιών με οποιαδήποτε από αυτές. Είναι επίσης ειδικό για εκτεταμένες κανονικές εκφράσεις.

Ας συνεχίσουμε. Τώρα πρόκειται να αναζητήσουμε τη λέξη "Linux", αλλά μόνο όταν δεν έχει κολλήσει σε άλλη λέξη στα αριστερά. Μπορούμε να το κάνουμε έτσι:

grep '\

Ο σημαντικός χαρακτήρας εδώ είναι "<", αλλά πρέπει να ξεφύγει βάζοντας το "\" μπροστά του, έτσι ώστε το grep να το ερμηνεύσει ως ειδικό χαρακτήρα. Το αποτέλεσμα έχει ως εξής:

αψίδα Linux: 11-03-2002 Από Linux Rulez.

Μπορείτε επίσης να χρησιμοποιήσετε το "\>" για να αναζητήσετε λέξεις που δεν βρίσκονται το ένα δίπλα στο άλλο. Ας δούμε ένα παράδειγμα. Ας δοκιμάσουμε αυτήν την εντολή:

grep 'http\>' regex

Η παραγωγή που παράγει είναι η εξής:

CentOS: http: //wiki.centos.org/

Το "Http" βγήκε, αλλά όχι το "https", επειδή στο "https" υπάρχει ακόμα ένας χαρακτήρας στα δεξιά του "p" που μπορεί να είναι μέρος μιας λέξης.

  • Οι χαρακτήρες "<" και ">" ταιριάζουν με την αρχή και το τέλος μιας λέξης, αντίστοιχα. Αυτοί οι χαρακτήρες πρέπει να διαγραφούν έτσι ώστε να μην ερμηνεύονται ως κυριολεκτικοί χαρακτήρες.

Πηγαίνουμε με πράγματα λίγο πιο περίπλοκα. Ο χαρακτήρας "+" ταιριάζει με τον χαρακτήρα στα αριστερά του, επαναλαμβανόμενος τουλάχιστον μία φορά. Αυτός ο χαρακτήρας είναι διαθέσιμος μόνο με εκτεταμένες κανονικές εκφράσεις. Με αυτό μπορούμε να αναζητήσουμε, για παράδειγμα, ακολουθίες διαφόρων αριθμών στη σειρά που ξεκινούν με ":".

grep -E ':[0-9]+' regex

αποτέλεσμα:

CentOs: 14-05-2004 03: 32: 38

Ο αριθμός 38 επισημαίνεται επίσης επειδή ξεκινά επίσης με ":".

  • Ο χαρακτήρας "+" ταιριάζει με τον χαρακτήρα στα αριστερά του, επαναλαμβανόμενος τουλάχιστον μία φορά.

Μπορείτε επίσης να ελέγξετε τον αριθμό των επαναλήψεων χρησιμοποιώντας τα "{" και "}". Η ιδέα είναι να τοποθετήσετε στηρίγματα έναν αριθμό που δείχνει τον ακριβή αριθμό επαναλήψεων που θέλουμε. Μπορείτε επίσης να βάλετε μια σειρά. Ας δούμε παραδείγματα των δύο περιπτώσεων.

Πρώτα θα βρούμε όλες τις τετραψήφιες ακολουθίες που υπάρχουν:

grep '[0-9]\{4\}' regex

Σημειώστε ότι τα σγουρά τιράντες πρέπει να ξεφύγουν εάν χρησιμοποιούμε βασικές κανονικές εκφράσεις, αλλά όχι εάν χρησιμοποιούμε εκτεταμένες. Με εκτεταμένο θα ήταν έτσι:

grep -E '[0-9]{4}' regex

Και το αποτέλεσμα και στις δύο περιπτώσεις θα ήταν αυτό:

ArchLinux: 11-03-2002
Gentoo: 31/03 /2002
CentOS: 14-05-2004 03:32:38
Debian: 16/08/1993
Ubuntu: 20/10 /2004
  • Οι χαρακτήρες "{" και "}" με έναν αριθμό μεταξύ τους ταιριάζουν με τον προηγούμενο χαρακτήρα που επαναλαμβάνεται τον καθορισμένο αριθμό φορών.

Τώρα το άλλο παράδειγμα με τα τιράντες. Ας υποθέσουμε ότι θέλουμε να βρούμε λέξεις με 3 έως 6 πεζά γράμματα. Θα μπορούσαμε να κάνουμε τα εξής:

grep '[a-z]\{3,6\}' regex

Και το αποτέλεσμα θα ήταν αυτό:

- ΛISTA de σελίδαs wiki: ΠΡΟΣ ΤΟrchLinux: https:/ /wiki.archlinux.org/ Ζπαρακαλώ: https:/ /wiki.gentoo.org/wiki/MAin_Pηλικία
CentOS: http:/ /wiki.CentOS.org/ Δεβανός: https:/ /wiki.debian.org/ Ήμπούντου: https:/ /wiki.ubuntu.com/ - ΣΤλείπεις de εκτόξευση: ΠΡΟΣ ΤΟrch Linux: 11-03-2002 Gπαρακαλώ: 31/03/2002 ΓentOs: 14-05-2004 03:32:38
Dεβανός: 16/08/1993 Uμπούντου: 20/10/2004 Δείναι Linux RΟυλέζ.

Το οποίο, όπως μπορείτε να δείτε, δεν μοιάζει πολύ με αυτό που θέλαμε. Αυτό συμβαίνει επειδή η κανονική έκφραση βρίσκει τα γράμματα με άλλες λέξεις που είναι μεγαλύτερες. Ας δοκιμάσουμε αυτήν την άλλη έκδοση:

grep '\<[a-z]\{3,6\}\>' regex

αποτέλεσμα:

- Λίστα σελίδων wiki: ArchLinux: https:/ /wiki.archlinux.org/ Gentoo: https:/ /wiki.gentoo.org/wiki/ Main_Page CentOS: http:/ /wiki.CentOS.org/ Debian: https:/ /wiki.debian.org/ Ubuntu: https:/ /wiki.ubuntu.com/

Αυτό μοιάζει ήδη με αυτό που θέλαμε. Αυτό που κάναμε είναι να απαιτείται η λέξη να ξεκινά λίγο πριν το πρώτο γράμμα και να τελειώνει αμέσως μετά το τελευταίο.

  • Οι χαρακτήρες "{" και "}" με δύο αριθμούς μεταξύ τους διαχωρισμένους με κόμμα ταιριάζουν με τον προηγούμενο χαρακτήρα επαναλαμβανόμενος τον αριθμό των φορών που υποδεικνύονται από τους δύο αριθμούς.

Ας δούμε τώρα έναν χαρακτήρα που είναι το πρωταρχικό του "+". Είναι "*" και η λειτουργία του είναι πολύ παρόμοια μόνο που ταιριάζει με οποιονδήποτε αριθμό χαρακτήρων, συμπεριλαμβανομένου του μηδέν. Δηλαδή, κάνει το ίδιο με το "+" αλλά δεν απαιτεί να εμφανίζεται ο χαρακτήρας στα αριστερά του στο κείμενο. Για παράδειγμα, ας προσπαθήσουμε να αναζητήσουμε αυτές τις διευθύνσεις που ξεκινούν από το wiki και καταλήγουν σε org:

grep 'wiki.*org' regex

Ας δούμε το αποτέλεσμα:

ArchLinux: https: //wiki.archlinux.org/ Gentoo: https: //wiki.gentoo.org/ wiki / Main_Page CentOS: http: //wiki.centos.org/ Debian: https: //wiki.debian.org/

Τέλεια.

Τώρα ο τελευταίος χαρακτήρας που θα δούμε. Ο χαρακτήρας "\" χρησιμοποιείται για να ξεφύγει από τον χαρακτήρα στα δεξιά του, ώστε να χάσει την ιδιαίτερη σημασία του. Για παράδειγμα: Ας υποθέσουμε ότι θέλουμε να εντοπίσουμε τις γραμμές που τελειώνουν σε ένα σημείο. Το πρώτο πράγμα που μπορεί να συμβεί σε εμάς θα μπορούσε να είναι αυτό:

grep '.$' regex

Το αποτέλεσμα δεν είναι αυτό που ψάχνουμε:

- Λίστα σελίδων wiki:
ArchLinux: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/
- Ημερομηνίες κυκλοφορίας: Arch Linux: 11-03-2002
Gentoo: 31/03/2002
CentOs: 14-05-2004 03:32:38
Debian: 16/08/1993
Ubuntu: 20/10/2004
Desde Linux Rulez.

Αυτό συμβαίνει επειδή το "". ταιριάζει με οτιδήποτε, έτσι ώστε η κανονική έκφραση να ταιριάζει με τον τελευταίο χαρακτήρα κάθε γραμμής ό, τι κι αν είναι. Η λύση είναι αυτή:

grep '\.$' regex

Τώρα το αποτέλεσμα είναι αυτό που θέλουμε:

Desde Linux Rulez.

Παιχνίδι πάνω

Αν και το θέμα των τακτικών εκφράσεων είναι τόσο περίπλοκο που θα έδινα για μια σειρά άρθρων, νομίζω ότι σας έχω ήδη δώσει αρκετό πόνο. Εάν καταφέρατε να φτάσετε, συγχαρητήρια. Και αν έχετε διαβάσει όλα αυτά σε μία συνεδρίαση, πάρτε μια ασπιρίνη ή κάτι τέτοιο, γιατί δεν μπορεί να είναι καλό.

Προς το παρόν αυτό είναι όλο. Εάν σας αρέσει αυτό το άρθρο, ίσως μπορείτε να γράψετε άλλο. Εν τω μεταξύ, σας συνιστώ να δοκιμάσετε όλες τις τυπικές εκφράσεις στο τερματικό για να δείτε καθαρά πώς λειτουργούν. Και να θυμάστε: Μόνο ο Chuck Norris μπορεί να αναλύσει HTML χρησιμοποιώντας κανονικές εκφράσεις.


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   Ιεζεκιήλ dijo

    Ποια θα ήταν η ζωή μας χωρίς το regex;
    Το άρθρο είναι πολύ χρήσιμο, αλλά θα το διαβάσω σιγά-σιγά. Ευχαριστώ πολύ.

    1.    hexborg dijo

      Ευχαριστώ για το σχόλιο. Δεν πιστεύω ακόμα ότι το άρθρο μου έχει κυκλοφορήσει. 🙂 Βγήκε με κάποιο σφάλμα, αλλά ελπίζω να είναι χρήσιμο. 🙂

  2.   Σκαβεμπούρ dijo

    Ευχαριστώ youssssssss! ..

    Πριν από λίγο καιρό έπρεπε να μελετήσω λίγο σχετικά με τις κανονικές εκφράσεις .. .. Σας ευχαριστώ που διδάξατε .. και τον βήμα προς βήμα οδηγό για να μάθετε καθένα από αυτά ..

    Πολύ καλό! .. .. Θα πάρω αυτήν την ασπιρίνη .. εε

    1.    hexborg dijo

      Παρακαλώ. Θάρρος και ότι οι κανονικές εκφράσεις δεν μπορούν να σας. 🙂

  3.   Τανάραξ dijo

    Φανταστική ανάρτηση! Καλή δουλειά. Αναρωτιέμαι πόσες ώρες σε πήρε 😀

    1.    hexborg dijo

      ΧΑΧΑΧΑ!! Το ερώτημα είναι: Πόσες ώρες θα μου πήρε αν είπα όλα όσα ήθελα να πω; Απειρος !! 🙂

  4.   Ταμμούζ dijo

    ένα πράγμα που δεν ήξερα, καλό άρθρο!

    1.    hexborg dijo

      Ευχαριστώ. Είναι χαρά να το μοιραστώ μαζί σας.

  5.   helena_ryuu dijo

    υπέροχη εξήγηση. συγχαρητήρια! πραγματικά χρήσιμο!

    1.    hexborg dijo

      Χαίρομαι που το βρήκατε χρήσιμο. Είναι χαρά λοιπόν να γράφω.

  6.   αντι dijo

    Αυτό πρέπει να πάει κάπου ξεχωριστό. Όπως τα Προτεινόμενα αλλά έχουν μια πολύ συγκεκριμένη χρησιμότητα. Αρκετά χρήσιμο, αν και θα ήθελα να το εφαρμόσω στο Vim.

    1.    hexborg dijo

      Αυτό είναι ένα ερώτημα που αναρωτιέμαι. Έχω στο μυαλό μου μερικά ακόμη άρθρα σχετικά με τις κανονικές εκφράσεις. Και θα μπορούσα να μιλήσω για το vim σε αυτά. Έχει κάποιες διαφορές από αυτά που εξήγησα σε αυτό το άρθρο. Είναι θέμα να συνεχίσουμε με αυτό. 🙂

  7.   Fernando dijo

    Καλή!

    Το άρθρο σου είναι πολύ καλό, είναι περίεργο, πρόσφατα (αυτή τη στιγμή) δημοσίευσα στον ιστότοπό μου ένα λήμμα που ετοίμαζα εδώ και λίγες μέρες όπου έχω συγκεντρώσει μια λίστα με μεταχαρακτήρες για κανονικές εκφράσεις και μερικά παραδείγματα. Και ήταν δίκαιο να μπω DesdeLinux και δείτε ένα λήμμα για το ίδιο θέμα!

    Αν είναι παρηγοριά, η δική μου είναι ΠΟΛΥ ΠΕΡΙΣΣΟΤΕΡΑ PUSSY 😀

    Σίγουρα το regex είναι ένα από τα πιο χρήσιμα πράγματα, συνήθως τα χρησιμοποιώ για να κόψω την έξοδο των εντολών και να διατηρήσω το μέρος που με ενδιαφέρει και, στη συνέχεια, να αλληλεπιδράσω μαζί του σε ένα σενάριο bash, για παράδειγμα. Τους έχω χρησιμοποιήσει επίσης πολύ στο πανεπιστήμιο και είναι ζωτικής σημασίας για την κατασκευή των μεταγλωττιστών (στον ορισμό των λεξικογραφικών και των αναλυτών). Εν ολίγοις, ένας ολόκληρος κόσμος.

    Χαιρετισμούς και πολύ καλή δουλειά.

    1.    hexborg dijo

      Σας ευχαριστώ πολύ.

      Μου άρεσε επίσης το άρθρο σας. Είναι πιο περιεκτικό από το δικό μου. Μπορεί να χρησιμεύσει ως γρήγορη αναφορά. Είναι σύμπτωση που τα έχουμε γράψει ταυτόχρονα. Μπορείτε να δείτε ότι οι άνθρωποι ενδιαφέρονται για το θέμα. 🙂

  8.   Έλερι dijo

    Οι κανονικές εκφράσεις για τα ανδρείκελα =), τώρα είναι πιο ξεκάθαρο για μένα, με τον τρόπο με τον οποίο ένας τρόπος να έχουμε την έξοδο με χρώμα για το grep, είναι η δημιουργία ενός ψευδωνύμου στο .bashrc ψευδώνυμο grep = 'grep –color = πάντα', σε περίπτωση που λειτουργεί για κάποιον .

    αφορά

    1.    hexborg dijo

      Αληθής. Αυτός είναι ένας άλλος τρόπος για να το κάνετε. Ευχαριστώ για τη συμβολή. 🙂

  9.   KZKG ^ Γκάρα dijo

    O_O… κομμάτι συνεισφοράς !!! Ω_Ο ...
    Σας ευχαριστώ πολύ για την ανάρτηση, περίμενα κάτι τέτοιο για λίγο lol, το άφησα ανοιχτό για να το διαβάσω ήρεμα στο σπίτι με μηδενική ταλαιπωρία για να συγκεντρωθεί το lol.

    Ευχαριστώ για το άρθρο, πραγματικά κάνω 😀

    1.    hexborg dijo

      Ήξερα ότι θα το θέλατε. ΧΑΧΑΧΑ!! Η αλήθεια είναι ότι λείπουν πολλά πράγματα, αλλά έχω ήδη ένα δεύτερο μέρος στο μυαλό μου. 🙂

  10.   Ελιέζερ Τατέ dijo

    Υπέροχο άρθρο, αν το είχα διαβάσει χθες, το μάθημα που έδωσα σήμερα θα ήταν ακόμα πιο εύκολο για τους μαθητές μου!

    1.    hexborg dijo

      ΧΑΧΑΧΑ!! Κρίμα που άργησα, αλλά χαίρομαι που είναι χρήσιμο. 🙂

  11.   Λεότορο dijo

    Τέλος !!!, εξαιρετικά καλή η ανάρτηση .... Βρήκα τελικά κάτι που εξηγεί με σαφήνεια τις κανονικές εκφράσεις…

    1.    hexborg dijo

      Υπάρχουν πολλές πληροφορίες εκεί έξω, αλλά είναι πιο δύσκολο να βρείτε κάτι που είναι εύκολα κατανοητό. Χαίρομαι που γέμισα αυτό το κενό. 🙂

      Χαιρετισμούς.

  12.   Σαίξπηρ Ρόδου dijo

    Γεια, χρειάζομαι βοήθεια, πρέπει να κάνω αναζήτηση στα Το μόνο πράγμα που κατάφερα να κάνω ήταν να καταργήσω όλο τον Σεπτέμβριο, αλλά δεν ξέρω πώς να κάνω την πλήρη αλυσίδα:

    ex: 1309 [0-3] μου επιστρέφει τα αρχεία καταγραφής από 1 Σεπτεμβρίου έως 30 Σεπτεμβρίου, αλλά δεν ξέρω πώς να μπω στην ίδια αλυσίδα από την 1η έως τις 11 Οκτωβρίου

    1.    hexborg dijo

      Το να το κάνεις χρησιμοποιώντας κανονικές εκφράσεις είναι λίγο περίπλοκο. Μου φαίνεται ότι κάτι τέτοιο μπορεί να λειτουργήσει:

      13(09[0-3]|10(0|1[01]))

      Είναι μια εκτεταμένη κανονική έκφραση. Δεν λέτε ποιο εργαλείο χρησιμοποιείτε, οπότε δεν μπορώ να σας δώσω περισσότερες λεπτομέρειες.

      Τέλος πάντων, νομίζω ότι συμβαίνει αυτό, αντί να χρησιμοποιώ κανονικές εκφράσεις, είναι καλύτερο να το κάνουμε με εύρεση. Μπορείτε να δοκιμάσετε κάτι τέτοιο:

      εύρημα. -newermt '01 sep '-α! -newermt '11 oct '-print

      Τυχη. Ελπίζω να σας βοηθήσει.

  13.   τσιπ dijo

    Γεια! Πρώτα απ 'όλα, θα ήθελα να σας ευχαριστήσω για τη δουλειά σας, καθώς αυτή η σελίδα συγκαταλέγεται μεταξύ των "κορυφαίων 3" από τους καλύτερους ιστότοπους Linux.
    Προπονούσα και δεν ήξερα γιατί ένα RegExp σε έναν αριθμό τηλεφώνου δεν λειτούργησε για μένα και ήταν ότι έλειπε το «-E» (το οποίο συνειδητοποίησα χάρη σε αυτήν την ανάρτηση)
    Θα ήθελα να σας ρωτήσω αν δεν γνωρίζετε ένα καλό pdf ή ιστότοπο όπου υπάρχουν ασκήσεις στο RegExp, αν και με λίγη φαντασία μπορείτε να εξασκηθείτε να τα εφεύρετε μόνοι σας.

    Χαιρετισμούς, Πάμπλο.

  14.   Κάλυ dijo

    Πολύ καλά, απλά τα διάβασα όλα, και ναι τώρα χρειάζομαι μια ασπιρίνη 🙂

  15.   Oscar dijo

    Η καλύτερη εξήγηση που έχω δει για κανονικές εκφράσεις. Ευχαριστώ τον συγγραφέα που μοιράστηκε αυτήν την εργασία.

    Ένα χαιρετισμό.

  16.   Αλεξάντερ dijo

    Μου άρεσε πολύ μια πολύ καλή εξήγηση