Η εντολή sed είναι μια συντομογραφία για το stream editor (επεξεργαστής ροής). Είναι ένα εξαιρετικά δημοφιλές εργαλείο σε συστήματα Linux/UNIX. Sed δεν είναι από μόνο του ένας επεξεργαστής κειμένου. Ωστόσο, μπορεί να εκτελέσει διάφορες τροποποιήσεις για το χειρισμό ενός δεδομένου κειμένου. Η είσοδος κειμένου αποστέλλεται ως ροή. Sed στη συνέχεια εκτελεί τις καθορισμένες ενέργειες στη ροή. Αυτός ο οδηγός παρέχει μια επισκόπηση της εντολής sed και πώς να τη χειριστείτε προκειμένου να επεξεργαστείτε με επιτυχία κείμενο στο Linux.
Το Sed στο Linux
Η ροή εισόδου του sed μπορεί να προέρχεται είτε από ένα αρχείο κειμένου είτε από το STDIN (τυπική είσοδος). Μπορούμε να εργαστούμε με την έξοδο μιας άλλης εντολής ή να εργαστούμε απευθείας με ένα αρχείο κειμένου. Το εργαλείο sed είναι προεγκατεστημένο σε όλες τις διανομές Linux.
Επισκόπηση χρήσης του Sed
Η εντολή sed ακολουθεί την εξής δομή:
|
1 |
$ sed <επιλογές> <εντολές> <αρχείο> |
Για σκοπούς επίδειξης, έχουμε λάβει την έκδοση κειμένου της άδειας GPL έκδοση 3:
|
1 |
$ wget https://www.gnu.org/licenses/gpl-3.0.txt |
Η ακόλουθη εντολή sed θα εκτυπώσει το περιεχόμενο του αρχείου κειμένου:
|
1 |
$ sed '' gpl-3.0.txt |
Εδώ, το sed εκτελεί τις λειτουργίες που περιγράφονται εντός των μονών εισαγωγικών και εκτυπώνει το αποτέλεσμα. Καθώς δεν έχει οριστεί κάποια επιλογή, το sed θα εκτελέσει απλώς μια κενή λειτουργία και θα εκτυπώσει ολόκληρο το περιεχόμενο του αρχείου.
Sed δέχεται επίσης την έξοδο από μια διαφορετική εντολή ως ροή εισόδου. Στο επόμενο παράδειγμα, διοχετεύστε το περιεχόμενο του αρχείου κειμένου GPL v3 στο sed για να εκτελέσετε μια κενή λειτουργία:
|
1 |
$ cat gpl-3.0.txt | sed '' |
Πώς να εκτυπώσετε γραμμές
Χωρίς να δοθεί κάποια επιλογή, το sed θα εκτυπώσει απευθείας όλα τα περιεχόμενα του αρχείου. Αντίθετα, μπορούμε να στείλουμε ρητά την εντολή εκτύπωσης για να εκτυπώσουμε τα αποτελέσματα απευθείας στην τυπική έξοδο (STDOUT).
Για να εκτυπώσετε την έξοδο, χρησιμοποιήστε τον χαρακτήρα p:
|
1 |
$ sed 'p' gpl-3.0.txt |
Από προεπιλογή, το sed εκτυπώνει την έξοδο στην οθόνη. Επειδή χρησιμοποιήσαμε συγκεκριμένα την εντολή εκτύπωσης, το sed θα εκτυπώσει κάθε γραμμή δύο φορές. Sed λειτουργεί γραμμή προς γραμμή. Διαβάζει μια γραμμή, εκτελεί συγκεκριμένες λειτουργίες, την εκτυπώνει και προχωρά στην επόμενη γραμμή.
Όπως μπορούμε να δούμε, κάθε γραμμή εκτυπώνεται δύο φορές. Εάν το αποτέλεσμα είναι μπερδεμένο έτσι, μπορούμε να το καθαρίσουμε χρησιμοποιώντας την επιλογή -n. Καταστέλλει την αυτόματη λειτουργία εκτύπωσης. Επειδή στέλνουμε την εντολή εκτύπωσης, δεν χρειάζεται να είναι ενεργοποιημένη η προεπιλεγμένη λειτουργία εκτύπωσης εξόδου:
|
1 |
$ sed -n 'p' gpl-3.0.txt |
Κλάσεις χαρακτήρων Regex
Στις κανονικές εκφράσεις, υπάρχουν διάφορες κλάσεις χαρακτήρων. Κάθε μία από αυτές τις κλάσεις έχει ένα εύρος. Πολλές κλάσεις έχουν επίσης πολλαπλές εκφράσεις. Οι περισσότερες κλάσεις είναι εύρη χαρακτήρων:
-
- [a-z]: Πεζός χαρακτήρας
-
- [A-Z]: Κεφαλαίος χαρακτήρας
-
- [0-9]: Ψηφία
-
- [a-zA-z]: Αλφάβητο
-
- [a-zA-z0-9]: Οποιοσδήποτε αλφαριθμητικός χαρακτήρας
Αυτές οι κλάσεις χαρακτήρων έχουν επίσης διαφορετικές σημειογραφίες:
-
- [:lower:]: Πεζός χαρακτήρας
-
- [:upper:]: Κεφαλαίος χαρακτήρας
-
- [:digit:]: Ψηφία
-
- [:alpha:]: Αλφάβητο
-
- [:alphanum:]: Αλφαριθμητικός χαρακτήρας
Για παράδειγμα, η ακόλουθη εντολή θα εκτυπώσει όλες τις γραμμές που περιέχουν τουλάχιστον ένα ψηφίο:
|
1 |
$ sed -n 's/[[:digit:]]/&/p' gpl-3.0.txt |
Εύρη διευθύνσεων
Μπορούμε να καθορίσουμε το συγκεκριμένο τμήμα της ροής κειμένου με το οποίο θέλουμε να εργαστούμε. Μπορεί να είναι η στατική θέση μιας γραμμής ή ένα εύρος γραμμών. Στο πρώτο παράδειγμα, θα εκτυπώσουμε τη γραμμή 5 από το αρχείο κειμένου GPL v3:
|
1 |
$ sed -n '5p' gpl-3.0.txt |
Αντί για μια μεμονωμένη γραμμή, μπορούμε επίσης να καθορίσουμε ένα εύρος γραμμών για να εργαστούμε. Εδώ, έχουμε δώσει το εύρος διευθύνσεων από τη γραμμή 5 έως τη γραμμή 9 (συνολικά 5 γραμμές) στο οποίο θα εργαστεί το sed :
|
1 |
$ sed -n '5,9p' gpl-3.0.txt |
Υπάρχουν επίσης διαφορετικοί τρόποι καθορισμού της διεύθυνσης γραμμής. Αντί να προσδιορίσουμε μόνοι μας τους αριθμούς των γραμμών, μπορούμε να αναδιατάξουμε το προηγούμενο παράδειγμα έτσι ώστε το sed να ξεκινήσει από τη γραμμή 5 και να λειτουργήσει στις επόμενες 5 γραμμές:
|
1 |
$ sed -n '5,+5p' gpl-3.0.txt |
Ένας άλλος τρόπος για να καθορίσετε γραμμές είναι η χρήση διαστημάτων. Στο επόμενο παράδειγμα, το sed θα ξεκινήσει από τη γραμμή 1 και θα λειτουργεί σε κάθε δεύτερη γραμμή:
|
1 |
$ sed -n '1~2p' gpl-3.0.txt |
Διαγραφή κειμένου
Μέχρι στιγμής, έχουμε εργαστεί για την εκτύπωση συγκεκριμένων γραμμών κειμένου. Αντί για εκτύπωση, μπορούμε να αφαιρέσουμε τις γραμμές από την έξοδο. Στο ακόλουθο παράδειγμα, θα αφαιρέσουμε πολλές γραμμές από την αρχή. Εδώ, δεν χρειάζεται να χρησιμοποιήσουμε την επιλογή -n επειδή θέλουμε το sed να εκτυπώσει όλα τα υπόλοιπα που δεν έχουν διαγραφεί. Για τη διαγραφή γραμμών, θα χρησιμοποιήσουμε την επιλογή d:
|
1 |
$ sed '1~2d' gpl-3.0.txt |
Σημειώστε ότι το αρχικό αρχείο παραμένει ανέπαφο. Sed απλώς εκτελεί τη διαγραφή γραμμών κατά τη διάρκεια της εξόδου. Αν θέλετε, μπορείτε να αποθηκεύσετε την έξοδο του sed σε ένα αρχείο. Μπορείτε να αντικαταστήσετε το αρχικό αρχείο ή να το αποθηκεύσετε ως διαφορετικό:
|
1 |
$ sed '1~2d' gpl-3.0.txt > gpl-3.0.modified.txt |
Αντί να γράψετε χειροκίνητα την έξοδο σε ένα αρχείο, το sed μπορεί να εκτελέσει μια επιτόπια επεξεργασία στο αρχικό αρχείο. Εν συντομία, το sed θα επεξεργαστεί το αρχικό αρχείο και θα γράψει τις αλλαγές που έγιναν. Αυτή η μέθοδος θα αντικαταστήσει το αρχικό αρχείο, επομένως θα πρέπει να χρησιμοποιείται με προσοχή:
|
1 |
$ sed -i '1~2d' gpl-3.0.txt |
Επειδή η επιτόπια επεξεργασία είναι επικίνδυνη, το sed διαθέτει τη λειτουργία δημιουργίας αντιγράφων ασφαλείας. Κατά την εκτέλεση επιτόπιων επεξεργασιών, χρησιμοποιήστε το -i.bak αντί για το -i για να δημιουργήσετε ένα αντίγραφο ασφαλείας πριν από την επεξεργασία. Sed θα δημιουργήσει το αρχείο αντιγράφου ασφαλείας με .bak επέκταση:
|
1 |
$ sed -i.bak '1~2d' gpl-3.0.txt |
Αντικατάσταση Κειμένου
Αυτή είναι, μακράν, μία από τις πιο συνηθισμένες εφαρμογές του sed. Αναζητά ένα μοτίβο κειμένου και το αντικαθιστά με ένα δεδομένο κείμενο. Εδώ, το μοτίβο κειμένου περιγράφεται με κανονικές εκφράσεις (regex εν συντομία). Για να μάθετε περισσότερα σχετικά με τη χρήση regex, ακολουθήστε αυτόν τον οδηγό που περιγράφει πώς να χρησιμοποιήσετε το Grep με regex για να αναζητήσετε μοτίβα κειμένου σε αρχεία.
Ακολουθεί ένα παράδειγμα της πιο βασικής αντικατάστασης κειμένου με χρήση regex:
|
1 |
$ 's/<search_pattern>/<replacement>' |
Εδώ, το s είναι η εντολή για αντικατάσταση. Οι κάθετοι είναι οριοθέτες για το μοτίβο και την αντικατάσταση. Ας το δούμε στην πράξη:
|
1 |
$ echo "hello world" | sed 's/hello/HELLO/' |
Το επόμενο παράδειγμα θα δείξει τη χρήση της κάτω παύλας (_). Εδώ, οι κάτω παύλες θα λειτουργήσουν ως οριοθέτες:
|
1 |
$ echo http://example.com/index.html | sed 's_com/index_net/home_' |
Εδώ, αναζητούμε το com/index για να το αλλάξουμε με το net/home. Σημειώστε τις θέσεις των κάτω παυλών καθώς είναι πολύ κρίσιμες. Για παράδειγμα, αν λείπει η τελευταία κάτω παύλα, το sed θα εμφανίσει σφάλμα:
|
1 |
$ echo "http://www.example.com/index.html" | sed 's_com/index_net/home' |
Χρειαζόμαστε ένα εικονικό αρχείο για να εξασκηθούμε σε κάποιες αντικαταστάσεις. Εδώ, έχω μια περικομμένη έκδοση του αρχείου κειμένου GPL v3:
|
1 |
$ cat gpl-3.0.cropped.txt |
Ας εκτελέσουμε μερικές βασικές αντικαταστάσεις κειμένου:
|
1 |
$ cat gpl-3.0.cropped.txt | sed 's/GNU/GNU is Not Unix/' |
Ρίξτε μια ματιά στο επόμενο παράδειγμα. Θέλουμε να αλλάξουμε όλες τις εμφανίσεις του the σε THE :
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/' |
Παρατηρείτε κάτι; Sed δεν άλλαξε όλες τις εμφανίσεις του the. Στην πραγματικότητα, άλλαξε μόνο την πρώτη εμφάνιση. Τι συμβαίνει; Αυτή είναι η προεπιλεγμένη συμπεριφορά της επιλογής s. Ταιριάζει μόνο με την πρώτη εμφάνιση σε μια δεδομένη γραμμή και προχωρά στην επόμενη. Για να διασφαλίσουμε ότι το sed ελέγχει ολόκληρη τη γραμμή για το μοτίβο αναζήτησης, πρέπει να χρησιμοποιήσουμε μια προαιρετική σημαία g. Ας διορθώσουμε την εντολή:
|
1 |
$ echo "the the quick brown fox jumps over the lazy dog" | sed 's/the/THE/g' |
Τώρα λειτουργεί όπως αναμενόταν. Ένας άλλος ενδιαφέρων τρόπος χρήσης της εντολής είναι ο καθορισμός του αριθμού των εμφανίσεων που θα αλλάξουν. Στο προηγούμενο παράδειγμα, υπήρχαν 3 εμφανίσεις του the, σωστά; Τι θα λέγατε να ορίσουμε να αλλάξει μόνο η 3rd εμφάνιση; Η αλλαγή θα πραγματοποιηθεί στην προαιρετική σημαία:
|
1 |
$ echo "η η γρήγορη καφέ αλεπού πηδάει πάνω από τον τεμπέλικο σκύλο" | sed 's/the/THE/3' |
Αν εργάζεστε με ένα μεγάλο αρχείο κειμένου, τότε ίσως βοηθούσε αν sed εκτύπωνε μόνο εκείνες τις γραμμές όπου πραγματοποιήθηκαν οι αντικαταστάσεις. Για να το επιτύχουμε αυτό, πρέπει να προσθέσουμε μια άλλη επιπλέον σημαία p:
|
1 |
$ sed -n 's/GNU/GNU is Not Unix/gp' gpl-3.0.txt |
Case Sensitivity
Από προεπιλογή, όλες οι sed λειτουργίες είναι ευαίσθητες στη διάκριση πεζών-κεφαλαίων. Η ακόλουθη εντολή θα δείξει την προεπιλεγμένη συμπεριφορά της διάκρισης πεζών-κεφαλαίων:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/' |
Λόγω της αναντιστοιχίας πεζών-κεφαλαίων, δεν υπάρχει καμία αλλαγή. Σε μια τέτοια περίπτωση, μπορούμε να πούμε στο sed να απενεργοποιήσει τη διάκριση πεζών-κεφαλαίων. Για να το κάνετε αυτό, προσθέστε την προαιρετική σημαία i:
|
1 |
$ echo "HELLO WORLD" | sed 's/hello/hElLo/i' |
Πώς να αντικαταστήσετε και να αναφέρετε κείμενα
Η δύναμη του sed έγκειται κυρίως στη δυνατότητά του να χρησιμοποιεί κανονικές εκφράσεις. Με πιο προηγμένα και περίπλοκα μοτίβα regex, μπορούμε να επιτύχουμε πολλά περισσότερα. Για παράδειγμα, μπορούμε να αντικαταστήσουμε κείμενο από την αρχή ενός αρχείου έως μια συγκεκριμένη θέση. Ρίξτε μια ματιά στην ακόλουθη έκφραση:
|
1 |
$ sed 's/^.*GNU/GNU_replaced/' gpl-3.0.txt |
Εδώ, το κείμενο caret (^) υποδηλώνει την έναρξη της γραμμής. Ο τελεστής αντιστοίχισης οποιουδήποτε χαρακτήρα υποδηλώνεται με τη χρήση της τελείας (.). Ο αστερίσκος (*) είναι η έκφραση μπαλαντέρ, που αντιστοιχεί από την αρχή της γραμμής μέχρι το GNU.
Ένα άλλο ενδιαφέρον κόλπο είναι η χρήση του συμβόλου &. Μπορούμε να το χρησιμοποιήσουμε για να επισημάνουμε τις περιοχές που το sedβρίσκει το μοτίβο αναζήτησης:
|
1 |
$ sed 's/^.*GNU/(&)/' gpl-3.0.txt |
Τελικές Σκέψεις
Σε αυτόν τον οδηγό, εξερευνήσαμε τα βασικά της εντολής sed Μάθαμε πώς να εκτυπώνουμε συγκεκριμένες γραμμές, να αναζητούμε κείμενα, να διαγράφουμε και να αντικαθιστούμε κείμενα, να αντικαθιστούμε πλήρως κείμενα και να χρησιμοποιούμε κανονικές εκφράσεις. Μια σωστά δομημένη εντολή sed μπορεί να μεταμορφώσει δραματικά ένα έγγραφο κειμένου. Μπορείτε πλέον να επεξεργαστείτε με επιτυχία κείμενο στο Linux με τη βοήθεια του sed.
Καλή ενασχόληση με τους υπολογιστές!









Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.