Advanced sed: Διαχείριση ροών κειμένου στο Linux. Χρήση του επεξεργαστή κειμένου ροής Linux sed Sed για την εισαγωγή μιας γραμμής σε ένα αρχείο

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



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

Τώρα θα αναλύσουμε τα βασικά της εργασίας με το sed, καθώς και θα δούμε περισσότερα από τρεις δωδεκάδες παραδείγματα χρήσης αυτού του εργαλείου.

sed βασικά

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

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

Για παράδειγμα, όπως αυτό:

$ echo "Αυτό είναι μια δοκιμή" | sed "s/test/άλλο τεστ/"
Δείτε τι συμβαίνει όταν εκτελείτε αυτήν την εντολή.


Ένα απλό παράδειγμα κλήσης sed

Σε αυτήν την περίπτωση, το sed αντικαθιστά τη λέξη "test" στη συμβολοσειρά που πέρασε για επεξεργασία με τις λέξεις "άλλο τεστ". Οι ευθείες κάθετες χρησιμοποιούνται για τη μορφοποίηση του κανόνα για την επεξεργασία κειμένου που περικλείεται σε εισαγωγικά. Στην περίπτωσή μας, χρησιμοποιήθηκε μια εντολή όπως s/pattern1/pattern2/. Το γράμμα «s» είναι συντομογραφία της λέξης «υποκατάστατο», δηλαδή έχουμε ομάδα αντικατάστασης. Ο Sed, εκτελώντας αυτήν την εντολή, θα κοιτάξει το μεταφερόμενο κείμενο και θα αντικαταστήσει τα θραύσματα που βρίσκονται σε αυτό (θα μιλήσουμε για ποια, θα μιλήσουμε παρακάτω), που αντιστοιχούν στο pattern1 , με το pattern2 .

Το παραπάνω είναι ένα πρωτόγονο παράδειγμα χρήσης του sed, μόνο και μόνο για να ξεκινήσετε. Στην πραγματικότητα, το sed μπορεί να χρησιμοποιηθεί σε πολύ πιο σύνθετα σενάρια επεξεργασίας κειμένου, όπως η εργασία με αρχεία.

Παρακάτω είναι ένα αρχείο που περιέχει ένα κομμάτι κειμένου και τα αποτελέσματα της επεξεργασίας του με αυτήν την εντολή:

$ sed "s/test/άλλο τεστ" ./myfile


Αρχείο κειμένου και τα αποτελέσματα επεξεργασίας του

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

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

Εκτέλεση συνόλων εντολών κατά την κλήση του sed

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

$ sed -e "s/This/That/; s/test/άλλο τεστ/" ./myfile


Χρησιμοποιώντας το διακόπτη -e όταν καλείτε sed

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

$ sed -e "> s/This/That/ > s/test/άλλο τεστ/" ./myfile
Αυτό συμβαίνει μετά την εκτέλεση της εντολής, που παρουσιάζεται σε αυτή τη φόρμα.


Ένας άλλος τρόπος για να δουλέψετε με το sed

Ανάγνωση εντολών από αρχείο

Εάν υπάρχουν πολλές εντολές sed για επεξεργασία κειμένου, είναι συνήθως καλύτερο να τις γράψετε πρώτα σε ένα αρχείο. Για να πείτε στο sed ένα αρχείο που περιέχει εντολές, χρησιμοποιήστε το διακόπτη -f:

Εδώ είναι το περιεχόμενο του αρχείου mycommands:

S/This/That/ s/test/άλλο τεστ/
Ας καλέσουμε το sed, δίνοντας στον επεξεργαστή ένα αρχείο με εντολές και ένα αρχείο προς επεξεργασία:

$ sed -f mycommands myfile
Το αποτέλεσμα της κλήσης μιας τέτοιας εντολής είναι παρόμοιο με αυτό που λήφθηκε στα προηγούμενα παραδείγματα.


Χρήση αρχείου με εντολές κατά την κλήση του sed

Αντικατάσταση σημαιών εντολών

Ρίξτε μια προσεκτική ματιά στο παρακάτω παράδειγμα.

$ sed "s/test/another test/" myfile
Εδώ είναι τι υπάρχει στο αρχείο και τι θα παραχθεί όταν ο sed το επεξεργάζεται.


Το αρχείο προέλευσης και τα αποτελέσματα της επεξεργασίας του

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

Η σύνταξη για τη σύνταξη μιας εντολής αντικατάστασης κατά τη χρήση σημαιών μοιάζει με αυτό:

S/μοτίβο/αντικατάσταση/σημαία
Η εκτέλεση αυτής της εντολής μπορεί να τροποποιηθεί με διάφορους τρόπους.

  • Κατά τη μετάδοση του αριθμού, λαμβάνεται υπόψη ο αριθμός σειράς της εμφάνισης του μοτίβου στη συμβολοσειρά· αυτό το φαινόμενο θα αντικατασταθεί.
  • Η σημαία g υποδεικνύει ότι όλες οι εμφανίσεις του μοτίβου στη συμβολοσειρά πρέπει να υποβληθούν σε επεξεργασία.
  • Η σημαία p υποδεικνύει ότι τα περιεχόμενα της αρχικής συμβολοσειράς πρέπει να εξάγονται.
  • Η σημαία αρχείου w λέει την εντολή εγγραφής των αποτελεσμάτων της επεξεργασίας κειμένου σε ένα αρχείο.
Εξετάστε τη χρήση της πρώτης παραλλαγής της εντολής αντικατάστασης, υποδεικνύοντας τη θέση της αντικατασταθείσας εμφάνισης του επιθυμητού τμήματος:

$ sed "s/test/άλλο τεστ/2" myfile

Κλήση της εντολής αντικατάστασης που καθορίζει τη θέση του τμήματος που πρόκειται να αντικατασταθεί

Εδώ καθορίσαμε τον αριθμό 2 ως σημαία αντικατάστασης. Αυτό οδήγησε στο γεγονός ότι αντικαταστάθηκε μόνο η δεύτερη εμφάνιση του επιθυμητού μοτίβου σε κάθε γραμμή. Τώρα ας δοκιμάσουμε την παγκόσμια σημαία αντικατάστασης - g:

$ sed "s/test/άλλο test/g" myfile
Όπως μπορείτε να δείτε από την έξοδο, αυτή η εντολή αντικατέστησε όλες τις εμφανίσεις του μοτίβου στο κείμενο.


Παγκόσμια Αντικατάσταση

Η σημαία εντολής αντικατάστασης p επιτρέπει την έξοδο ταιριασμένων γραμμών, ενώ η επιλογή -n που καθορίζεται κατά την κλήση του sed καταστέλλει την κανονική έξοδο:

$ sed -n "s/test/άλλο test/p" myfile
Ως αποτέλεσμα, όταν το sed εκτελείται σε αυτήν τη διαμόρφωση, εμφανίζονται στην οθόνη μόνο οι γραμμές (στην περίπτωσή μας, μία γραμμή) στις οποίες βρίσκεται το συγκεκριμένο κομμάτι κειμένου.


Χρησιμοποιώντας την εντολή αντικατάστασης flag p

Ας χρησιμοποιήσουμε τη σημαία w, η οποία σας επιτρέπει να αποθηκεύσετε τα αποτελέσματα της επεξεργασίας κειμένου σε ένα αρχείο:

$ sed "s/test/άλλο test/w έξοδο" myfile


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

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

Οριοθέτες χαρακτήρες

Φανταστείτε να αντικαταστήσετε το /bin/bash με /bin/csh στο /etc/passwd. Το έργο δεν είναι τόσο δύσκολο:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Ωστόσο, δεν φαίνεται πολύ καλό. Το θέμα είναι ότι εφόσον οι κάθετες προς τα εμπρός χρησιμοποιούνται ως διαχωριστικοί χαρακτήρες, οι ίδιοι χαρακτήρες στις γραμμές που μεταβιβάζονται στο sed πρέπει να διαφεύγουν. Ως αποτέλεσμα, η αναγνωσιμότητα της εντολής υποφέρει.

Ευτυχώς, το sed μας επιτρέπει να ορίσουμε μόνοι μας τους χαρακτήρες οριοθέτησης για χρήση στην εντολή αντικατάστασης. Ο οριοθέτης είναι ο πρώτος χαρακτήρας που εμφανίζεται μετά το s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Σε αυτήν την περίπτωση, ένα θαυμαστικό χρησιμοποιείται ως οριοθέτης, κάνοντας τον κώδικα πιο ευανάγνωστο και πολύ πιο καθαρό από πριν.

Επιλογή θραυσμάτων κειμένου για επεξεργασία

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

$ sed "2s/test/άλλο τεστ/" myfile


Επεξεργάζεται μόνο μία γραμμή, τον αριθμό που δίνεται όταν καλείτε sed

Η δεύτερη επιλογή είναι μια σειρά από συμβολοσειρές:

$ sed "2,3s/test/άλλο τεστ/" myfile


Χειρισμός εύρους σειράς

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

$ sed "2,$s/test/άλλη δοκιμή/" myfile


Επεξεργασία αρχείου από τη δεύτερη γραμμή μέχρι το τέλος

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

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Κατ' αναλογία με αυτό που συζητήθηκε παραπάνω, το πρότυπο περνάει πριν από το όνομα της εντολής s .


Επεξεργασία σειρών που ταιριάζουν με ένα φίλτρο

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

Αφαίρεση σειρών

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

Η κλήση εντολής μοιάζει με αυτό:

$ sed "3d" myfile
Θέλουμε να αφαιρεθεί η τρίτη γραμμή από το κείμενο. Σημειώστε ότι αυτό δεν είναι αρχείο. Το αρχείο θα παραμείνει αμετάβλητο, η διαγραφή θα επηρεάσει μόνο την έξοδο που δημιουργείται από το sed.


Αφαίρεση της τρίτης γραμμής

Εάν δεν καθορίσετε τον αριθμό γραμμής που θέλετε να διαγράψετε όταν καλείτε την εντολή d, όλες οι γραμμές στη ροή θα διαγραφούν.

Δείτε πώς μπορείτε να εφαρμόσετε την εντολή d σε μια σειρά γραμμών:

$ sed "2,3d" myfile


Διαγραφή εύρους σειρών

Και εδώ είναι πώς μπορείτε να διαγράψετε γραμμές, ξεκινώντας από τη δεδομένη - έως το τέλος του αρχείου:

$ sed "3,$d" myfile


Διαγράψτε τις γραμμές στο τέλος του αρχείου

Οι σειρές μπορούν επίσης να διαγραφούν σύμφωνα με το μοτίβο:

$ sed "/test/d" myfile


Διαγραφή συμβολοσειρών ανά μοτίβο

Όταν καλείτε το d, μπορείτε να καθορίσετε μερικά μοτίβα - οι γραμμές στις οποίες εμφανίζεται το μοτίβο και αυτές οι γραμμές που βρίσκονται μεταξύ τους, θα διαγραφούν:

$ sed "/second/,/fourth/d" myfile


Αφαίρεση εύρους σειρών με χρήση μοτίβων

Εισαγωγή κειμένου σε ροή

Με το sed, μπορείτε να εισαγάγετε δεδομένα σε μια ροή κειμένου χρησιμοποιώντας τις εντολές i και a:
  • Η εντολή i προσθέτει μια νέα γραμμή πριν από τη δεδομένη.
  • Η εντολή a προσθέτει μια νέα γραμμή μετά τη δεδομένη.
Εξετάστε ένα παράδειγμα χρησιμοποιώντας την εντολή i:

$ echo "Άλλη μια δοκιμή" | sed "i\First test"


Ομάδα Ι

Τώρα ας ρίξουμε μια ματιά στην εντολή a:

$ echo "Άλλη μια δοκιμή" | sed "a\First test"


Ομάδα α

Όπως μπορείτε να δείτε, αυτές οι εντολές προσθέτουν κείμενο πριν ή μετά τα δεδομένα από τη ροή. Τι γίνεται αν χρειαστεί να προσθέσετε μια γραμμή κάπου στη μέση;

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

$ sed "2i\Αυτή είναι η γραμμή που έχει εισαχθεί." myfile


εντολή με αριθμό γραμμής αναφοράς

Ας κάνουμε το ίδιο με την εντολή a:

$ sed "2a\Αυτή είναι η προσαρτημένη γραμμή." myfile


Εντολή a με αριθμό γραμμής αναφοράς

Σημειώστε τη διαφορά στον τρόπο λειτουργίας των εντολών i και a. Η πρώτη εισάγει μια νέα γραμμή πριν από την καθορισμένη, η δεύτερη - μετά.

Αντικατάσταση χορδής

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

$ sed "3c\Αυτή είναι μια τροποποιημένη γραμμή." myfile


Αντικατάσταση ολόκληρης χορδής

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

$ sed "/This is/c Αυτή είναι μια αλλαγμένη γραμμή κειμένου." myfile


Αντικατάσταση χορδών με μοτίβο

Αντικατάσταση χαρακτήρων

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

$ sed "y/123/567/" myfile


Αντικατάσταση χαρακτήρων

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

Εμφάνιση αριθμών γραμμών

Εάν καλέσετε το sed χρησιμοποιώντας την εντολή =, το βοηθητικό πρόγραμμα θα εκτυπώσει τους αριθμούς γραμμής στη ροή δεδομένων:

$ sed "=" myfile


Εμφάνιση αριθμών γραμμών

Το πρόγραμμα επεξεργασίας ροής εξήγαγε τους αριθμούς γραμμών πριν από το περιεχόμενό τους.

Εάν περάσετε ένα μοτίβο σε αυτήν την εντολή και χρησιμοποιήσετε την επιλογή sed -n, θα εκτυπωθούν μόνο οι αριθμοί γραμμών που ταιριάζουν με το μοτίβο:

$ sed -n "/test/=" myfile


Εμφάνιση αριθμών γραμμής που ταιριάζουν με ένα μοτίβο

Ανάγνωση δεδομένων που θα εισαχθούν από ένα αρχείο

Παραπάνω, εξετάσαμε τεχνικές για την εισαγωγή δεδομένων σε μια ροή, υποδεικνύοντας τι πρέπει να εισαχθεί, ακριβώς κατά την κλήση του sed. Μπορείτε επίσης να χρησιμοποιήσετε ένα αρχείο ως πηγή δεδομένων. Για να το κάνετε αυτό, χρησιμοποιήστε την εντολή r, η οποία σας επιτρέπει να εισάγετε δεδομένα από το καθορισμένο αρχείο στη ροή. Όταν το καλείτε, μπορείτε να καθορίσετε τον αριθμό γραμμής μετά τον οποίο θέλετε να εισαγάγετε τα περιεχόμενα του αρχείου ή ένα πρότυπο.

Εξετάστε ένα παράδειγμα:

$ sed "3r newfile" myfile


Εισαγωγή περιεχομένου αρχείου σε ροή

Εδώ το περιεχόμενο του newfile έχει εισαχθεί μετά την τρίτη γραμμή του myfile .

Δείτε τι συμβαίνει εάν χρησιμοποιείτε ένα πρότυπο όταν καλείτε την εντολή r:

$ sed "/test/r newfile" myfile


Χρήση μπαλαντέρ κατά την επίκληση της εντολής r

Τα περιεχόμενα του αρχείου θα εισαχθούν μετά από κάθε γραμμή που ταιριάζει με το μοτίβο.

Παράδειγμα

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

Μπορείτε να λύσετε αυτό το πρόβλημα χρησιμοποιώντας τις εντολές r και d του προγράμματος επεξεργασίας ροής sed:

$ Sed "/DATA>/ ( r newfile d)" myfile


Αντικατάσταση του placeholder με πραγματικά δεδομένα

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

Αποτελέσματα

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

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

Αγαπητοι αναγνωστες! Χρησιμοποιείτε sed στην καθημερινή σας εργασία; Εάν ναι, μοιραστείτε την εμπειρία σας.

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



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

Τώρα θα αναλύσουμε τα βασικά της εργασίας με το sed, καθώς και θα δούμε περισσότερα από τρεις δωδεκάδες παραδείγματα χρήσης αυτού του εργαλείου.

sed βασικά

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

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

Για παράδειγμα, όπως αυτό:

$ echo "Αυτό είναι μια δοκιμή" | sed "s/test/άλλο τεστ/"
Δείτε τι συμβαίνει όταν εκτελείτε αυτήν την εντολή.


Ένα απλό παράδειγμα κλήσης sed

Σε αυτήν την περίπτωση, το sed αντικαθιστά τη λέξη "test" στη συμβολοσειρά που πέρασε για επεξεργασία με τις λέξεις "άλλο τεστ". Οι ευθείες κάθετες χρησιμοποιούνται για τη μορφοποίηση του κανόνα για την επεξεργασία κειμένου που περικλείεται σε εισαγωγικά. Στην περίπτωσή μας, χρησιμοποιήθηκε μια εντολή όπως s/pattern1/pattern2/. Το γράμμα «s» είναι συντομογραφία της λέξης «υποκατάστατο», δηλαδή έχουμε ομάδα αντικατάστασης. Ο Sed, εκτελώντας αυτήν την εντολή, θα κοιτάξει το μεταφερόμενο κείμενο και θα αντικαταστήσει τα θραύσματα που βρίσκονται σε αυτό (θα μιλήσουμε για ποια, θα μιλήσουμε παρακάτω), που αντιστοιχούν στο pattern1 , με το pattern2 .

Το παραπάνω είναι ένα πρωτόγονο παράδειγμα χρήσης του sed, μόνο και μόνο για να ξεκινήσετε. Στην πραγματικότητα, το sed μπορεί να χρησιμοποιηθεί σε πολύ πιο σύνθετα σενάρια επεξεργασίας κειμένου, όπως η εργασία με αρχεία.

Παρακάτω είναι ένα αρχείο που περιέχει ένα κομμάτι κειμένου και τα αποτελέσματα της επεξεργασίας του με αυτήν την εντολή:

$ sed "s/test/άλλο τεστ" ./myfile


Αρχείο κειμένου και τα αποτελέσματα επεξεργασίας του

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

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

Εκτέλεση συνόλων εντολών κατά την κλήση του sed

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

$ sed -e "s/This/That/; s/test/άλλο τεστ/" ./myfile


Χρησιμοποιώντας το διακόπτη -e όταν καλείτε sed

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

$ sed -e "> s/This/That/ > s/test/άλλο τεστ/" ./myfile
Αυτό συμβαίνει μετά την εκτέλεση της εντολής, που παρουσιάζεται σε αυτή τη φόρμα.


Ένας άλλος τρόπος για να δουλέψετε με το sed

Ανάγνωση εντολών από αρχείο

Εάν υπάρχουν πολλές εντολές sed για επεξεργασία κειμένου, είναι συνήθως καλύτερο να τις γράψετε πρώτα σε ένα αρχείο. Για να πείτε στο sed ένα αρχείο που περιέχει εντολές, χρησιμοποιήστε το διακόπτη -f:

Εδώ είναι το περιεχόμενο του αρχείου mycommands:

S/This/That/ s/test/άλλο τεστ/
Ας καλέσουμε το sed, δίνοντας στον επεξεργαστή ένα αρχείο με εντολές και ένα αρχείο προς επεξεργασία:

$ sed -f mycommands myfile
Το αποτέλεσμα της κλήσης μιας τέτοιας εντολής είναι παρόμοιο με αυτό που λήφθηκε στα προηγούμενα παραδείγματα.


Χρήση αρχείου με εντολές κατά την κλήση του sed

Αντικατάσταση σημαιών εντολών

Ρίξτε μια προσεκτική ματιά στο παρακάτω παράδειγμα.

$ sed "s/test/another test/" myfile
Εδώ είναι τι υπάρχει στο αρχείο και τι θα παραχθεί όταν ο sed το επεξεργάζεται.


Το αρχείο προέλευσης και τα αποτελέσματα της επεξεργασίας του

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

Η σύνταξη για τη σύνταξη μιας εντολής αντικατάστασης κατά τη χρήση σημαιών μοιάζει με αυτό:

S/μοτίβο/αντικατάσταση/σημαία
Η εκτέλεση αυτής της εντολής μπορεί να τροποποιηθεί με διάφορους τρόπους.

  • Κατά τη μετάδοση του αριθμού, λαμβάνεται υπόψη ο αριθμός σειράς της εμφάνισης του μοτίβου στη συμβολοσειρά· αυτό το φαινόμενο θα αντικατασταθεί.
  • Η σημαία g υποδεικνύει ότι όλες οι εμφανίσεις του μοτίβου στη συμβολοσειρά πρέπει να υποβληθούν σε επεξεργασία.
  • Η σημαία p υποδεικνύει ότι τα περιεχόμενα της αρχικής συμβολοσειράς πρέπει να εξάγονται.
  • Η σημαία αρχείου w λέει την εντολή εγγραφής των αποτελεσμάτων της επεξεργασίας κειμένου σε ένα αρχείο.
Εξετάστε τη χρήση της πρώτης παραλλαγής της εντολής αντικατάστασης, υποδεικνύοντας τη θέση της αντικατασταθείσας εμφάνισης του επιθυμητού τμήματος:

$ sed "s/test/άλλο τεστ/2" myfile

Κλήση της εντολής αντικατάστασης που καθορίζει τη θέση του τμήματος που πρόκειται να αντικατασταθεί

Εδώ καθορίσαμε τον αριθμό 2 ως σημαία αντικατάστασης. Αυτό οδήγησε στο γεγονός ότι αντικαταστάθηκε μόνο η δεύτερη εμφάνιση του επιθυμητού μοτίβου σε κάθε γραμμή. Τώρα ας δοκιμάσουμε την παγκόσμια σημαία αντικατάστασης - g:

$ sed "s/test/άλλο test/g" myfile
Όπως μπορείτε να δείτε από την έξοδο, αυτή η εντολή αντικατέστησε όλες τις εμφανίσεις του μοτίβου στο κείμενο.


Παγκόσμια Αντικατάσταση

Η σημαία εντολής αντικατάστασης p επιτρέπει την έξοδο ταιριασμένων γραμμών, ενώ η επιλογή -n που καθορίζεται κατά την κλήση του sed καταστέλλει την κανονική έξοδο:

$ sed -n "s/test/άλλο test/p" myfile
Ως αποτέλεσμα, όταν το sed εκτελείται σε αυτήν τη διαμόρφωση, εμφανίζονται στην οθόνη μόνο οι γραμμές (στην περίπτωσή μας, μία γραμμή) στις οποίες βρίσκεται το συγκεκριμένο κομμάτι κειμένου.


Χρησιμοποιώντας την εντολή αντικατάστασης flag p

Ας χρησιμοποιήσουμε τη σημαία w, η οποία σας επιτρέπει να αποθηκεύσετε τα αποτελέσματα της επεξεργασίας κειμένου σε ένα αρχείο:

$ sed "s/test/άλλο test/w έξοδο" myfile


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

Φαίνεται ξεκάθαρα ότι κατά τη λειτουργία της εντολής, τα δεδομένα εξάγονται στο STDOUT , ενώ οι επεξεργασμένες γραμμές εγγράφονται στο αρχείο του οποίου το όνομα καθορίζεται μετά το w .

Οριοθέτες χαρακτήρες

Φανταστείτε να αντικαταστήσετε το /bin/bash με /bin/csh στο /etc/passwd. Το έργο δεν είναι τόσο δύσκολο:

$ sed "s/\/bin\/bash/\/bin\/csh/" /etc/passwd
Ωστόσο, δεν φαίνεται πολύ καλό. Το θέμα είναι ότι εφόσον οι κάθετες προς τα εμπρός χρησιμοποιούνται ως διαχωριστικοί χαρακτήρες, οι ίδιοι χαρακτήρες στις γραμμές που μεταβιβάζονται στο sed πρέπει να διαφεύγουν. Ως αποτέλεσμα, η αναγνωσιμότητα της εντολής υποφέρει.

Ευτυχώς, το sed μας επιτρέπει να ορίσουμε μόνοι μας τους χαρακτήρες οριοθέτησης για χρήση στην εντολή αντικατάστασης. Ο οριοθέτης είναι ο πρώτος χαρακτήρας που εμφανίζεται μετά το s:

$ sed "s!/bin/bash!/bin/csh!" /etc/passwd
Σε αυτήν την περίπτωση, ένα θαυμαστικό χρησιμοποιείται ως οριοθέτης, κάνοντας τον κώδικα πιο ευανάγνωστο και πολύ πιο καθαρό από πριν.

Επιλογή θραυσμάτων κειμένου για επεξεργασία

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

$ sed "2s/test/άλλο τεστ/" myfile


Επεξεργάζεται μόνο μία γραμμή, τον αριθμό που δίνεται όταν καλείτε sed

Η δεύτερη επιλογή είναι μια σειρά από συμβολοσειρές:

$ sed "2,3s/test/άλλο τεστ/" myfile


Χειρισμός εύρους σειράς

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

$ sed "2,$s/test/άλλη δοκιμή/" myfile


Επεξεργασία αρχείου από τη δεύτερη γραμμή μέχρι το τέλος

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

$ sed "/likegeeks/s/bash/csh/" /etc/passwd
Κατ' αναλογία με αυτό που συζητήθηκε παραπάνω, το πρότυπο περνάει πριν από το όνομα της εντολής s .


Επεξεργασία σειρών που ταιριάζουν με ένα φίλτρο

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

Αφαίρεση σειρών

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

Η κλήση εντολής μοιάζει με αυτό:

$ sed "3d" myfile
Θέλουμε να αφαιρεθεί η τρίτη γραμμή από το κείμενο. Σημειώστε ότι αυτό δεν είναι αρχείο. Το αρχείο θα παραμείνει αμετάβλητο, η διαγραφή θα επηρεάσει μόνο την έξοδο που δημιουργείται από το sed.


Αφαίρεση της τρίτης γραμμής

Εάν δεν καθορίσετε τον αριθμό γραμμής που θέλετε να διαγράψετε όταν καλείτε την εντολή d, όλες οι γραμμές στη ροή θα διαγραφούν.

Δείτε πώς μπορείτε να εφαρμόσετε την εντολή d σε μια σειρά γραμμών:

$ sed "2,3d" myfile


Διαγραφή εύρους σειρών

Και εδώ είναι πώς μπορείτε να διαγράψετε γραμμές, ξεκινώντας από τη δεδομένη - έως το τέλος του αρχείου:

$ sed "3,$d" myfile


Διαγράψτε τις γραμμές στο τέλος του αρχείου

Οι σειρές μπορούν επίσης να διαγραφούν σύμφωνα με το μοτίβο:

$ sed "/test/d" myfile


Διαγραφή συμβολοσειρών ανά μοτίβο

Όταν καλείτε το d, μπορείτε να καθορίσετε μερικά μοτίβα - οι γραμμές στις οποίες εμφανίζεται το μοτίβο και αυτές οι γραμμές που βρίσκονται μεταξύ τους, θα διαγραφούν:

$ sed "/second/,/fourth/d" myfile


Αφαίρεση εύρους σειρών με χρήση μοτίβων

Εισαγωγή κειμένου σε ροή

Με το sed, μπορείτε να εισαγάγετε δεδομένα σε μια ροή κειμένου χρησιμοποιώντας τις εντολές i και a:
  • Η εντολή i προσθέτει μια νέα γραμμή πριν από τη δεδομένη.
  • Η εντολή a προσθέτει μια νέα γραμμή μετά τη δεδομένη.
Εξετάστε ένα παράδειγμα χρησιμοποιώντας την εντολή i:

$ echo "Άλλη μια δοκιμή" | sed "i\First test"


Ομάδα Ι

Τώρα ας ρίξουμε μια ματιά στην εντολή a:

$ echo "Άλλη μια δοκιμή" | sed "a\First test"


Ομάδα α

Όπως μπορείτε να δείτε, αυτές οι εντολές προσθέτουν κείμενο πριν ή μετά τα δεδομένα από τη ροή. Τι γίνεται αν χρειαστεί να προσθέσετε μια γραμμή κάπου στη μέση;

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

$ sed "2i\Αυτή είναι η γραμμή που έχει εισαχθεί." myfile


εντολή με αριθμό γραμμής αναφοράς

Ας κάνουμε το ίδιο με την εντολή a:

$ sed "2a\Αυτή είναι η προσαρτημένη γραμμή." myfile


Εντολή a με αριθμό γραμμής αναφοράς

Σημειώστε τη διαφορά στον τρόπο λειτουργίας των εντολών i και a. Η πρώτη εισάγει μια νέα γραμμή πριν από την καθορισμένη, η δεύτερη - μετά.

Αντικατάσταση χορδής

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

$ sed "3c\Αυτή είναι μια τροποποιημένη γραμμή." myfile


Αντικατάσταση ολόκληρης χορδής

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

$ sed "/This is/c Αυτή είναι μια αλλαγμένη γραμμή κειμένου." myfile


Αντικατάσταση χορδών με μοτίβο

Αντικατάσταση χαρακτήρων

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

$ sed "y/123/567/" myfile


Αντικατάσταση χαρακτήρων

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

Εμφάνιση αριθμών γραμμών

Εάν καλέσετε το sed χρησιμοποιώντας την εντολή =, το βοηθητικό πρόγραμμα θα εκτυπώσει τους αριθμούς γραμμής στη ροή δεδομένων:

$ sed "=" myfile


Εμφάνιση αριθμών γραμμών

Το πρόγραμμα επεξεργασίας ροής εξήγαγε τους αριθμούς γραμμών πριν από το περιεχόμενό τους.

Εάν περάσετε ένα μοτίβο σε αυτήν την εντολή και χρησιμοποιήσετε την επιλογή sed -n, θα εκτυπωθούν μόνο οι αριθμοί γραμμών που ταιριάζουν με το μοτίβο:

$ sed -n "/test/=" myfile


Εμφάνιση αριθμών γραμμής που ταιριάζουν με ένα μοτίβο

Ανάγνωση δεδομένων που θα εισαχθούν από ένα αρχείο

Παραπάνω, εξετάσαμε τεχνικές για την εισαγωγή δεδομένων σε μια ροή, υποδεικνύοντας τι πρέπει να εισαχθεί, ακριβώς κατά την κλήση του sed. Μπορείτε επίσης να χρησιμοποιήσετε ένα αρχείο ως πηγή δεδομένων. Για να το κάνετε αυτό, χρησιμοποιήστε την εντολή r, η οποία σας επιτρέπει να εισάγετε δεδομένα από το καθορισμένο αρχείο στη ροή. Όταν το καλείτε, μπορείτε να καθορίσετε τον αριθμό γραμμής μετά τον οποίο θέλετε να εισαγάγετε τα περιεχόμενα του αρχείου ή ένα πρότυπο.

Εξετάστε ένα παράδειγμα:

$ sed "3r newfile" myfile


Εισαγωγή περιεχομένου αρχείου σε ροή

Εδώ το περιεχόμενο του newfile έχει εισαχθεί μετά την τρίτη γραμμή του myfile .

Δείτε τι συμβαίνει εάν χρησιμοποιείτε ένα πρότυπο όταν καλείτε την εντολή r:

$ sed "/test/r newfile" myfile


Χρήση μπαλαντέρ κατά την επίκληση της εντολής r

Τα περιεχόμενα του αρχείου θα εισαχθούν μετά από κάθε γραμμή που ταιριάζει με το μοτίβο.

Παράδειγμα

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

Μπορείτε να λύσετε αυτό το πρόβλημα χρησιμοποιώντας τις εντολές r και d του προγράμματος επεξεργασίας ροής sed:

$ Sed "/DATA>/ ( r newfile d)" myfile


Αντικατάσταση του placeholder με πραγματικά δεδομένα

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

Αποτελέσματα

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

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

Αγαπητοι αναγνωστες! Χρησιμοποιείτε sed στην καθημερινή σας εργασία; Εάν ναι, μοιραστείτε την εμπειρία σας.

Πολλοί από εσάς πιθανότατα έχετε χρησιμοποιήσει το πρόγραμμα επεξεργασίας κειμένου sed stream για κάποιους από τους σκοπούς σας, αν όχι, θα χαρώ να σας πω γι 'αυτό, θα προσπαθήσω να είμαι πιο λεπτομερής. Γιατί λέγεται ροή; Η απάντηση είναι απλή - φανταστείτε ένα έγγραφο κειμένου εισαγωγής που περνά μέσα από το πρόγραμμα και το αποτέλεσμα είναι κάποια άλλη μορφή αυτού του αρχείου που επεξεργάζεται το πρόγραμμα. Ένα είδος μηχανής μύλου - βάζεις κρέας, με βάση το πλέγμα - παίρνεις είτε κιμά είτε κάτι άλλο.

Έτσι, από προεπιλογή, φαίνεται ότι αυτό το βοηθητικό πρόγραμμα θα πρέπει να είναι ήδη στο σύστημά σας (στην περίπτωσή μου, το είχα ήδη στο Debian 7.6), αν όχι, τότε -

Με κείμενο:

η παράμετρος "s" στην αρχή υποδεικνύει ότι πρέπει να αντικαταστήσετε το κείμενο, g - στο τέλος του κειμένου που αντικαταστάθηκε - ότι πρέπει να το κάνετε αυτό καθολικά (σε ολόκληρο το αρχείο)

Για παράδειγμα, θέλουμε να αντικαταστήσουμε τη λέξη Sergey με τον Andrey στο αρχείο text.txt και να ανεβάσουμε όλα αυτά στο αρχείο textout.txt, ενεργούμε:

sed "s/Sergey/Andrey/g" κείμενο . txt > textout . κείμενο

Αποτέλεσμα:

Εάν θέλετε να κάνετε αντικαταστάσεις για ειδικούς χαρακτήρες - για παράδειγμα, για τον χαρακτήρα &, τότε πρέπει να προηγηθείτε του ειδικού. βάλτε μια ανάστροφη κάθετο "\" με έναν χαρακτήρα, εάν θέλετε να καθορίσετε τι sed πρέπει να αντιστραφεί στην αρχή της γραμμής, χρησιμοποιείται ο ειδικός χαρακτήρας "^". Επιπλέον, σε μία γραμμή μπορείτε να γράψετε 2 ή περισσότερες αλλαγές χωρίζοντάς τες με ένα ερωτηματικό - ";". Για παράδειγμα, βασανίζουμε το ήδη αλλαγμένο αρχείο textout.txt. Αρχικά, θα εμφανίσω ξανά το τρέχον περιεχόμενο του αρχείου textout.txt:

root @ testhostname : ~ # cat textout.txt

Δοκιμή για τον Αντρέι

Τεστ 2 για τον Αντρέι

Τεστ 3 για τον Αντρέι

Τώρα εισάγετε την εντολή:

sed "s/for/\&/g;s/^Test/Sergey/g" κείμενο . txt > textout2 . κείμενο

Έτσι, αντί για τη λέξη για, βάζουμε το εικονίδιο & (ο ειδικός χαρακτήρας εισάγεται με το σύμβολο "\" πριν από τον ειδικό χαρακτήρα), μετά το σύμβολο διαχωρισμού (για να γράψουμε όλες τις αλλαγές σε μια γραμμή sed'a -> " ;", αντί για τη λέξη στην αρχή της γραμμής "Δοκιμή" βάλτε τη λέξη Σεργκέι, το αποτέλεσμα αυτού που συνέβη:

Όλα όπως τα θέλαμε!

Έτσι, ο sed είναι ένας καλός βοηθός κατά την προβολή αρχείων καταγραφής. Για παράδειγμα, πρέπει να ανεβάσουμε όλες τις γραμμές της σημερινής ημερομηνίας (ας είναι 10 Οκτωβρίου στην περίπτωσή μας) από το αρχείο καταγραφής /var/log/messages στο αρχείο testlog.txt, ας προχωρήσουμε:

sed - n "/^Οκτ. 10/ p" / var / log / messages > testlog . κείμενο

Εδώ έχουμε προσθέσει την παράμετρο -n και, στη συνέχεια, - '/^Οκτ. 10/ - που σημαίνει ότι η γραμμή πρέπει να ξεκινά από την ημερομηνία 10 Οκτωβρίου, μετά την παράμετρο p - που σημαίνει εκτύπωση (εκτύπωση του περιεχομένου υπό αυτήν την συνθήκη), και μετά την πηγή αρχείο και το αρχείο όπου πετάμε τα αποτελέσματα σύμφωνα με την κατάσταση του φίλτρου μας, εκτελέστε το, δείτε τι περιέχει το αρχείο testlog.txt μόνο στις 10 Οκτωβρίου:

Πρόστιμο! Εάν δεν χρειάζονται πολλές γραμμές, αλλά υπό όρους υπάρχει ανάγκη να ληφθούν μόνο από την πρώτη έως την πέμπτη γραμμή, διαχωρίζουμε το τρέχον αίτημά μας με το σύμβολο "|" αφαιρώντας τη μεταφόρτωση στο αρχείο testlog.txt και γράφοντας sed -n 1.5p - που σημαίνει ότι πρέπει να κάνουμε έξοδο (p - εκτύπωση στο τέλος της έκφρασης) από το πρώτο "1" στο (χωρισμένο με κόμμα) το πέμπτο "5 "γραμμή. Συνολικά, παίρνουμε κάτι σαν αυτό:

sed - n "/^Οκτ. 10/ p" / var / log / μηνύματα | sed - n 1 , 5p > testlog - 5strok.txt

Για άλλη μια φορά, εφιστώ την προσοχή σας στο γεγονός ότι το αρχείο όπου ανεβάζουμε τα αποτελέσματα έχει μετακινηθεί στο τέλος (testlog-5strok.txt), βλέπουμε το αποτέλεσμα των ενεργειών μας:

Το πρόγραμμα επεξεργασίας ροής sed είναι ένα μη διαδραστικό πρόγραμμα επεξεργασίας κειμένου που εκτελεί λειτουργίες εισαγωγής από τυπική είσοδο ή από αρχείο. Ο Sed επεξεργάζεται τις πληροφορίες γραμμή προς γραμμή.

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

Συνδυασμός ομάδων

Μερικές φορές καθίσταται απαραίτητο να περάσετε πολλές εντολές στον επεξεργαστή sed ταυτόχρονα. Αυτό γίνεται με διάφορους τρόπους.

Εάν δεν διαθέτετε ήδη δοκιμαστικό αρχείο για εργασία με το sed, δημιουργήστε το ακόλουθο περιβάλλον:

CD
cp /usr/share/common-licenses/BSD .
cp /usr/share/common-licenses/GPL-3.
echo «αυτό είναι το τραγούδι που δεν τελειώνει ποτέ


μη γνωρίζοντας τι ήταν

ακριβώς επειδή..." > ενοχλητικό.txt

Εφόσον το sed λειτουργεί με τυπική είσοδο και έξοδο, μπορείτε φυσικά απλώς να καλέσετε τις διάφορες εντολές sed μαζί στην ίδια γραμμή:

sed "s/and/\&/" annoying.txt | sed "s/people/horses/"

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

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

Μπορείτε να περάσετε πολλές εντολές στο sed ταυτόχρονα χρησιμοποιώντας την επιλογή -e, η οποία πρέπει να εισαχθεί πριν από κάθε εντολή:

sed -e "s/and/\&/" -e "s/people/horses/" annoying.txt

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

sed "s/and/\&/;s/people/horses/" annoying.txt

Σημειώστε ότι όταν χρησιμοποιείτε τη σημαία -e, πρέπει να σπάσετε μεμονωμένα εισαγωγικά και όταν χρησιμοποιείτε ερωτηματικό, όλες οι εντολές μπορούν να παρατίθενται σε μονά εισαγωγικά.

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

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

sed "=" ενοχλητικό.txt
1
αυτό είναι το τραγούδι που δεν τελειώνει ποτέ
2
ναι, συνεχίζει και συνεχίζεται, φίλε μου
3
κάποιοι άρχισαν να το τραγουδούν
4
μη γνωρίζοντας τι ήταν
5
και θα συνεχίσουν να το τραγουδούν για πάντα
6
απλά επειδή...

Τώρα δοκιμάστε να επεξεργαστείτε το κείμενο για να δείτε πώς αλλάζει η μορφή αρίθμησης.

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

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

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

sed "=;G" ενοχλητικό.txt
1
αυτό είναι το τραγούδι που δεν τελειώνει ποτέ
_
2
ναι, συνεχίζει και συνεχίζεται, φίλε μου
_
3
κάποιοι άρχισαν να το τραγουδούν
_
4
μη γνωρίζοντας τι ήταν
. . .
. . .

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

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

sed "=" ενοχλητικό.txt | sed "G"
1
_
αυτό είναι το τραγούδι που δεν τελειώνει ποτέ
_
2
_
ναι, συνεχίζει και συνεχίζεται, φίλε μου
_
3
_
κάποιοι άρχισαν να το τραγουδούν
. . .
. . .

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

Προηγμένη διευθυνσιοδότηση

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

sed "1,3s/.*/Hello/" annoying.txt
Χαίρετε
Χαίρετε
Χαίρετε
μη γνωρίζοντας τι ήταν
και θα συνεχίσουν να το τραγουδούν για πάντα
απλά επειδή...

Αντίθετα, μπορείτε να χρησιμοποιήσετε μια τυπική έκφραση που βρίσκει μόνο γραμμές που περιέχουν ένα συγκεκριμένο μοτίβο. Για να το κάνετε αυτό, πρέπει να βάλετε το μοτίβο αναζήτησης ανάμεσα σε δύο κάθετες (/) πριν από την εντολή.

sed "/singing/s/it/& loudly/" annoying.txt
αυτό είναι το τραγούδι που δεν τελειώνει ποτέ
ναι, συνεχίζει και συνεχίζεται, φίλε μου
κάποιοι άρχισαν να το τραγουδούν δυνατά
μη γνωρίζοντας τι ήταν
και θα συνεχίσουν να το τραγουδούν δυνατά για πάντα
απλά επειδή...

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

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

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

sed "/^$/d" GPL-3
GNU ΓΕΝΙΚΗ ΔΗΜΟΣΙΑ ΑΔΕΙΑ
Έκδοση 3, 29 Ιουνίου 2007
Πνευματικά δικαιώματα (C) 2007 Free Software Foundation, Inc.
Όλοι επιτρέπεται να αντιγράφουν και να διανέμουν αυτολεξεί αντίγραφα
αυτού του εγγράφου άδειας, αλλά δεν επιτρέπεται η αλλαγή του.
Προοίμιο
Η Γενική Δημόσια Άδεια GNU είναι μια δωρεάν άδεια copyleft για
. . .
. . .

Λάβετε υπόψη ότι οι τυπικές εκφράσεις μπορούν να χρησιμοποιηθούν σε οποιοδήποτε μέρος του εύρους.

Για παράδειγμα, μπορείτε να διαγράψετε τις γραμμές μεταξύ των γραμμών START και END:

sed "/^START$/,/^END$/d" αρχείο εισόδου

Σημειώστε ότι αυτή η εντολή θα διαγράψει όλες τις γραμμές από την πρώτη λέξη ΕΝΑΡΞΗ που θα βρει μέχρι την πρώτη λέξη ΤΕΛΟΣ που θα βρει και εάν στη συνέχεια συναντήσει ξανά τη λέξη START, θα συνεχίσει να διαγράφει δεδομένα.

Για να αντιστρέψετε τη διευθυνσιοδότηση (δηλαδή, επιλέξτε γραμμές που δεν ταιριάζουν με ένα μοτίβο), χρησιμοποιήστε ένα θαυμαστικό (!).

Για παράδειγμα, για να διαγράψετε οποιαδήποτε ολοκληρωμένη σειρά, θα πρέπει να πληκτρολογήσετε:

sed "/^$/!d" GPL-3

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

Χρησιμοποιώντας ένα επιπλέον buffer

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

Το επιπλέον buffer είναι μια προσωρινή περιοχή αποθήκευσης που μπορεί να τροποποιηθεί με ορισμένες εντολές.

Έχοντας αυτό το επιπλέον buffer σας επιτρέπει να αποθηκεύετε συμβολοσειρές ενώ εργάζεστε σε άλλες συμβολοσειρές.

Εντολές για εργασία με το buffer:

  • h: Αντιγράφει την τρέχουσα προσωρινή μνήμη επεξεργασίας (την τελευταία αντιστοιχισμένη γραμμή στην οποία εργάζεστε) σε μια πρόσθετη προσωρινή μνήμη.
  • H: Προσθέτει την τρέχουσα προσωρινή μνήμη επεξεργασίας στο τέλος της τρέχουσας πρόσθετης επεξεργασίας, διαχωρισμένη με \n.
  • ζ: Αντιγράφει την τρέχουσα πρόσθετη προσωρινή μνήμη στην τρέχουσα προσωρινή μνήμη επεξεργασίας. Το προηγούμενο buffer επεξεργασίας θα χαθεί.
  • Ζ: Προσθέτει το τρέχον μοτίβο στην τρέχουσα προσωρινή μνήμη επεξεργασίας, διαχωρισμένο με \n.
  • x: Εναλλάσσει το τρέχον πρότυπο και το πρόσθετο buffer.

Το περιεχόμενο του πρόσθετου buffer δεν μπορεί να χειριστεί μέχρι να μετακινηθεί στο buffer επεξεργασίας.

Ας εξετάσουμε ένα περίπλοκο παράδειγμα.

Δοκιμάστε να ενώσετε γειτονικές γραμμές με την ακόλουθη εντολή:

sed -n "1~2h;2~2(H;g;s/\n/ /;p)" annoying.txt


Σημείωση: Στην πραγματικότητα, το sed παρέχει μια ξεχωριστή ενσωματωμένη εντολή N για αυτό. αλλά για πρακτική είναι χρήσιμο να εξετάσουμε αυτό το παράδειγμα.

Η επιλογή -n καταστέλλει την αυτόματη έξοδο.

1~2h - ορισμός διεύθυνσης που εκτελεί διαδοχική αντικατάσταση κάθε δεύτερης γραμμής κειμένου, ξεκινώντας από την πρώτη (δηλαδή, κάθε περιττή γραμμή). Η εντολή h αντιγράφει τις αντίστοιχες γραμμές σε ένα πρόσθετο buffer.

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

Φυσικά, το ενσωματωμένο N που αναφέρθηκε προηγουμένως είναι πολύ πιο σύντομο και απλούστερο και επιστρέφει το ίδιο αποτέλεσμα:

sed -n "N;s/\n/ /p" ενοχλητικό.txt
αυτό είναι το τραγούδι που δεν τελειώνει ποτέ ναι, συνεχίζεται και συνεχίζεται φίλε μου
κάποιοι άρχισαν να το τραγουδούν χωρίς να ξέρουν τι ήταν
και θα συνεχίσουν να το τραγουδούν για πάντα μόνο και μόνο επειδή...

sed σενάρια

Οι εντολές μπορούν να συνδυαστούν σε σενάρια. Αυτό σας επιτρέπει να εκτελέσετε ένα ολόκληρο σύνολο εντολών σε ένα μόνο πρότυπο στόχο.

Για παράδειγμα, μπορείτε να γράψετε ένα σενάριο για τη δημιουργία απλών μηνυμάτων κειμένου που πρέπει να μορφοποιηθούν εκ των προτέρων.

Τότε δεν χρειάζεται να επαναλαμβάνετε συνεχώς τις ίδιες εντολές για κάθε μήνυμα. Ουσιαστικά, ένα σενάριο sed είναι μια λίστα εντολών που πρέπει να εφαρμοστούν σε ένα δεδομένο αντικείμενο.

Για παράδειγμα:

s/αυτό/αυτό/ζ
s/χιόνι/βροχή/g
1,5 δ./κουκουνάκι/βερίκοκο/γρ

Στη συνέχεια, μπορείτε να καλέσετε το αρχείο:

sed -f sedScriptName fileToEdit

συμπέρασμα

Τώρα γνωρίζετε πιο προηγμένες μεθόδους εργασίας με το sed.

Στην αρχή, οι εντολές sed είναι δύσκολο να γίνουν κατανοητές και εύκολο να μπερδευτούν. Επομένως, συνιστάται να πειραματιστείτε με αυτά πριν τα χρησιμοποιήσετε σε σημαντικά δεδομένα.

Ετικέτες: ,
Συνεχίζοντας το θέμα:
Διαδίκτυο

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

Νέα άρθρα
/
Δημοφιλής