Πώς να χρησιμοποιήσετε την εντολή sed στο Linux

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

Η δύναμη του sed

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

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

Με sedμπορείτε να κάνετε όλα τα ακόλουθα:

  • Επιλέξτε κείμενο
  • Κείμενο αντικατάστασης
  • Προσθέστε γραμμές στο κείμενο
  • Διαγραφή γραμμών από κείμενο
  • Τροποποιήστε (ή διατηρήστε) ένα πρωτότυπο αρχείο

Έχουμε δομήσει τα παραδείγματα μας για να εισαγάγουμε και να δείξουμε έννοιες, όχι για να παράγουμε τις πιο στενές (και λιγότερο προσιτές) sedεντολές. Ωστόσο, οι λειτουργίες αντιστοίχισης προτύπων και επιλογής κειμένου sed βασίζονται σε μεγάλο βαθμό σε κανονικές εκφράσεις (regexes). Θα χρειαστείτε κάποια εξοικείωση με αυτά για να αξιοποιήσετε στο έπακρο sed.

ΣΧΕΤΙΖΕΤΑΙ ΜΕ: Τρόπος χρήσης κανονικών εκφράσεων (regexes) σε Linux

Ένα απλό παράδειγμα

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

echo howtogonk | sed 's / gonk / geek /'

Η echoεντολή στέλνει το "howtogonk" sedκαι εφαρμόζεται ο απλός κανόνας αντικατάστασης (το "s" σημαίνει αντικατάσταση). sed αναζητά το κείμενο εισαγωγής για την εμφάνιση της πρώτης συμβολοσειράς και θα αντικαταστήσει τυχόν αντιστοιχίσεις με τη δεύτερη.

Η συμβολοσειρά "gonk" αντικαθίσταται από "geek" και η νέα συμβολοσειρά εκτυπώνεται στο παράθυρο του τερματικού.

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

Επιλογή κειμένου

Θα χρειαστούμε ένα αρχείο κειμένου για τα παραδείγματα μας. Θα χρησιμοποιήσουμε ένα που περιέχει μια επιλογή στίχων από το επικό ποίημα του Samuel Taylor Coleridge «The Rime of the Ancient Mariner».

Πληκτρολογούμε τα ακόλουθα για να το ρίξουμε μια ματιά με less:

λιγότερο coleridge.txt

Για να επιλέξετε μερικές γραμμές από το αρχείο, παρέχουμε τις γραμμές έναρξης και λήξης του εύρους που θέλουμε να επιλέξουμε. Ένας μεμονωμένος αριθμός επιλέγει αυτήν τη γραμμή.

Για να εξαγάγουμε τις γραμμές ένα έως τέσσερα, πληκτρολογούμε αυτήν την εντολή:

sed -n '1,4p' coleridge.txt

Σημειώστε το κόμμα μεταξύ 1και 4. Τα pμέσα "εκτυπώνονται αντιστοιχισμένες γραμμές". Από προεπιλογή,  sed εκτυπώνει όλες τις γραμμές. Θα δούμε όλο το κείμενο στο αρχείο με τις αντίστοιχες γραμμές να εκτυπώνονται δύο φορές. Για να το αποτρέψουμε αυτό, θα χρησιμοποιήσουμε την -nεπιλογή (αθόρυβη) για να καταργήσουμε το απαράμιλλο κείμενο.

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

sed -n '6,9p' coleridge.txt

Μπορούμε να χρησιμοποιήσουμε την -eεπιλογή (έκφραση) για να κάνουμε πολλές επιλογές. Με δύο εκφράσεις, μπορούμε να επιλέξουμε δύο στίχους, όπως:

sed -n -e '1,4p' -e '31, 34p 'coleridge.txt

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

sed -n -e '1,4p' -e '30, 34p 'coleridge.txt

Μπορούμε επίσης να επιλέξουμε μια γραμμή εκκίνησης και να πούμε sed να περάσουμε από το αρχείο και να εκτυπώσουμε εναλλακτικές γραμμές, κάθε πέμπτη γραμμή ή να παραλείψουμε οποιονδήποτε αριθμό γραμμών. Η εντολή είναι παρόμοια με εκείνη που χρησιμοποιήσαμε παραπάνω για να επιλέξετε ένα εύρος. Αυτή τη φορά, ωστόσο, θα χρησιμοποιήσουμε ένα tilde ( ~) αντί για κόμμα για να διαχωρίσουμε τους αριθμούς.

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

Πληκτρολογούμε τα εξής:

sed -n '1 ~ 2p' coleridge.txt

Δεν θα ξέρετε πάντα πού βρίσκεται το αρχείο που αναζητάτε στο αρχείο, πράγμα που σημαίνει ότι οι αριθμοί γραμμής δεν θα είναι πάντα πολύ χρήσιμοι. Ωστόσο, μπορείτε επίσης να χρησιμοποιήσετε sed για να επιλέξετε γραμμές που περιέχουν αντίστοιχα μοτίβα κειμένου. Για παράδειγμα, ας εξαγάγουμε όλες τις γραμμές που ξεκινούν με "Και".

Το caret ( ^) αντιπροσωπεύει την αρχή της γραμμής. Θα εσωκλείσουμε τον όρο αναζήτησης σε κάθετο ( /). Περιλαμβάνουμε επίσης ένα κενό μετά το "Και", ώστε να μην περιλαμβάνονται λέξεις όπως "Android" στο αποτέλεσμα.

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

sed -n '/ ^ Και / p' coleridge.txt

Τρεις γραμμές που ξεκινούν με "Και" εξάγονται από το αρχείο και εμφανίζονται για εμάς.

Δημιουργία αντικαταστάσεων

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

echo howtogonk | sed 's / gonk / geek /'

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

Πληκτρολογούμε τα ακόλουθα για να αλλάξουμε όλες τις εμφανίσεις της "ημέρας" σε "εβδομάδα" και δίνουμε στον ναυτικό και τον άλμπατρος περισσότερο χρόνο για να συνδέσετε:

sed -n 's / ημέρα / εβδομάδα / p' coleridge.txt

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

sed -n 's / ημέρα / εβδομάδα / gp' coleridge.txt

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

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

sed -n 's / ημέρα / εβδομάδα / gip' coleridge.txt

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

Για παράδειγμα, εάν περικλείουμε χαρακτήρες σε αγκύλες ( []), ερμηνεύονται ως "οποιοσδήποτε χαρακτήρας από αυτήν τη λίστα χαρακτήρων".

Πληκτρολογούμε τα ακόλουθα και συμπεριλαμβάνουμε τα "D" και "d" στην ομάδα, για να βεβαιωθούμε ότι ταιριάζει τόσο "Day" όσο και "Day":

sed -n 's / [Dd] ay / week / gp' coleridge.txt

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

sed -n '1,4p' coleridge.txt

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

Τα βάζουμε όλα αυτά στην ακόλουθη εντολή:

sed -n '1,4 s / * / / gp' coleridge.txt

Αυτό λειτουργεί ωραία! Το μοτίβο αναζήτησης είναι αυτό που είναι σημαντικό εδώ. Ο αστερίσκος ( *) αντιπροσωπεύει μηδέν ή περισσότερο από τον προηγούμενο χαρακτήρα, που είναι κενό. Έτσι, το μοτίβο αναζήτησης ψάχνει συμβολοσειρές ενός ή περισσότερων χώρων.

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

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

sed -n '1,4 s / * / / gp' coleridge.txt

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

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

Πληκτρολογούμε τα ακόλουθα, χρησιμοποιώντας το -e(έκφραση) που χρησιμοποιήσαμε νωρίτερα, το οποίο μας επιτρέπει να κάνουμε δύο ή περισσότερες αντικαταστάσεις ταυτόχρονα:

sed -n -e / s / motion / flutter / gip '-e' s / ocean / gutter / gip 'coleridge.txt

Μπορούμε να επιτύχουμε το ίδιο αποτέλεσμα εάν χρησιμοποιήσουμε ένα ερωτηματικό ( ;) για να διαχωρίσουμε τις δύο εκφράσεις, όπως:

sed -n 's / motion / flutter / gip; s / ocean / gutter / gip' coleridge.txt

Όταν ανταλλάξαμε «ημέρα» για «εβδομάδα» στην ακόλουθη εντολή, η περίπτωση «ημέρας» στην έκφραση «καλά μια μέρα» άλλαξε επίσης:

sed -n 's / [Dd] ay / week / gp' coleridge.txt

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

Πληκτρολογούμε τα παρακάτω για να κάνουμε το μοτίβο που ταιριάζει με τη λέξη «μετά»:

sed -n '/ after / s / [Dd] ay / week / gp' coleridge.txt

Αυτό μας δίνει την απάντηση που θέλουμε.

Πιο σύνθετες υποκαταστάσεις

Ας δώσουμε ένα διάλειμμα στο Coleridge και χρησιμοποιήστε sedγια να εξαγάγετε ονόματα από το etc/passwdαρχείο.

Υπάρχουν πιο σύντομοι τρόποι για να το κάνετε αυτό (περισσότερα σε αυτό αργότερα), αλλά θα χρησιμοποιήσουμε τον μακρύτερο τρόπο εδώ για να δείξουμε μια άλλη ιδέα. Κάθε αντιστοιχισμένο στοιχείο σε ένα μοτίβο αναζήτησης (που ονομάζεται υποεκφράσεις) μπορεί να αριθμηθεί (έως και εννέα στοιχεία κατ 'ανώτατο όριο). Στη συνέχεια, μπορείτε να χρησιμοποιήσετε αυτούς τους αριθμούς στις sedεντολές σας  για αναφορά συγκεκριμένων υποεκφράσεων.

Πρέπει να συμπεριλάβετε την υποεκφραση σε παρενθέσεις [ ()] για να λειτουργήσει αυτό. Πριν από τις παρενθέσεις πρέπει να προηγείται κάθετο ( \) για να αποτραπεί η αντιμετώπισή τους ως φυσιολογικού χαρακτήρα.

Για να το κάνετε αυτό, θα πληκτρολογήσετε τα εξής:

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

Ας το αναλύσουμε:

  • sed 's/: Η sedεντολή και η αρχή της έκφρασης αντικατάστασης.
  • \(: Η παρένθεση ανοίγματος [ (] που περικλείει την υποεκφραση, πριν από την κάθετο ( \)
  • [^:]*: Η πρώτη υποεκφραση του όρου αναζήτησης περιέχει μια ομάδα σε αγκύλες. Το caret ( ^) σημαίνει "όχι" όταν χρησιμοποιείται σε μια ομάδα. Μια ομάδα σημαίνει ότι κάθε χαρακτήρας που δεν είναι άνω και κάτω τελεία ( :) θα γίνει αποδεκτός ως αντιστοιχία.
  • \): Η παρένθεση κλεισίματος [ )] με προηγούμενη ανάστροφη κάθετο ( \).
  • .*: Αυτή η δεύτερη δευτερεύουσα έκφραση αναζήτησης σημαίνει "οποιονδήποτε χαρακτήρα και οποιονδήποτε αριθμό από αυτούς."
  • /\1: Το τμήμα υποκατάστασης της έκφρασης περιέχει 1πριν από μια ανάστροφη κάθετο ( \). Αυτό αντιπροσωπεύει το κείμενο που ταιριάζει με την πρώτη υποεκφραση.
  • /': Το κλείσιμο προς τα εμπρός-κάθετο ( /) και ένα μόνο απόσπασμα ( ') τερματίζουν την sedεντολή.

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

Κάθε γραμμή στο /etc/passwdαρχείο ξεκινά με ένα όνομα χρήστη με τελεία. Ταιριάζουμε τα πάντα με το πρώτο κόλον και στη συνέχεια αντικαθιστούμε αυτήν την τιμή για ολόκληρη τη γραμμή. Έτσι, έχουμε απομονώσει τα ονόματα χρήστη.

Στη συνέχεια, θα περικλείσουμε τη δεύτερη υποεκφραση σε παρενθέσεις [ ()] ώστε να μπορούμε να την αναφέρουμε και με αριθμό. Θα αντικαταστήσουμε επίσης \1 με \2. Η εντολή μας θα αντικαταστήσει τώρα ολόκληρη τη γραμμή με τα πάντα, από την πρώτη άνω και κάτω τελεία ( :) έως το τέλος της γραμμής.

Πληκτρολογούμε τα εξής:

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

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

Τώρα, ας ρίξουμε μια ματιά στον γρήγορο και εύκολο τρόπο για να το κάνουμε αυτό.

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

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

sed 's /:.*// "/ etc / passwd

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

Έχουμε ένα αρχείο κόμμα ( ,) που διαχωρίζει τα ονόματα και τα επώνυμα. Θέλουμε να τα αναφέρουμε ως "επώνυμο, όνομα". Μπορούμε να χρησιμοποιήσουμε  cat, όπως φαίνεται παρακάτω, για να δούμε τι υπάρχει στο αρχείο:

γάτα geeks.txt

Όπως πολλές sedεντολές, αυτή η επόμενη μπορεί να φαίνεται αρχικά αδιαπέραστη:

sed 's / ^ \ (. * \), \ (. * \) $ / \ 2, \ 1 / g' geeks.txt

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

  • sed 's/: Η κανονική εντολή αντικατάστασης.
  • ^: Επειδή το caret δεν είναι σε ομάδα ( []), σημαίνει "Η αρχή της γραμμής."
  • \(.*\),: Η πρώτη υποεκφραση είναι οποιοσδήποτε αριθμός χαρακτήρων. Περιβάλλεται σε παρένθεση [ ()], καθεμία από τις οποίες προηγείται ανάστροφη κάθετο ( \), ώστε να μπορούμε να την αναφέρουμε με αριθμό. Όλο το μοτίβο αναζήτησης μας μεταφράζεται ως αναζήτηση από την αρχή της γραμμής έως το πρώτο κόμμα ( ,) για οποιονδήποτε αριθμό χαρακτήρων.
  • \(.*\):  Η επόμενη υποεκφραση είναι (πάλι) οποιοσδήποτε αριθμός οποιουδήποτε χαρακτήρα. Επίσης περικλείεται σε παρένθεση [ ()], και οι δύο προηγούνται από κάθετο ( \), ώστε να μπορούμε να αναφέρουμε το αντίστοιχο κείμενο με αριθμό.
  • $/: Το σύμβολο του δολαρίου ( $) αντιπροσωπεύει το τέλος της γραμμής και θα επιτρέψει την αναζήτησή μας να συνεχιστεί μέχρι το τέλος της γραμμής. Το χρησιμοποιήσαμε απλώς για να εισαγάγουμε το σύμβολο του δολαρίου. Δεν το χρειαζόμαστε πραγματικά, καθώς ο αστερίσκος ( *) θα έφτανε στο τέλος της γραμμής σε αυτό το σενάριο. Η κάθετος ( /) ολοκληρώνει την ενότητα μοτίβου αναζήτησης.
  • \2,\1 /g': Επειδή εσωκλείσαμε τις δύο υποεκφράσεις μας σε παρενθέσεις, μπορούμε να αναφέρουμε και τις δύο από τον αριθμό τους. Επειδή θέλουμε να αντιστρέψουμε τη σειρά, τις πληκτρολογούμε ως second-match,first-match. Πριν από τους αριθμούς πρέπει να υπάρχει μια ανάστροφη κάθετος ( \).
  • /g: Αυτό επιτρέπει στην εντολή μας να λειτουργεί παγκοσμίως σε κάθε γραμμή.
  • geeks.txt: Το αρχείο που επεξεργαζόμαστε.

Μπορείτε επίσης να χρησιμοποιήσετε την εντολή Cut ( c) για να αντικαταστήσετε ολόκληρες γραμμές που ταιριάζουν με το μοτίβο αναζήτησης. Πληκτρολογούμε τα παρακάτω για να αναζητήσουμε μια γραμμή με τη λέξη "λαιμός" σε αυτό και να την αντικαταστήσουμε με μια νέα συμβολοσειρά κειμένου:

sed '/ neck / c Γύρω από τον καρπό μου έδεσε το coleridge.txt

Η νέα μας γραμμή εμφανίζεται τώρα στο κάτω μέρος του αποσπάσματος.

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

Μπορούμε επίσης να εισαγάγουμε νέες γραμμές και κείμενο στο αρχείο μας. Για να εισαγάγουμε νέες γραμμές μετά από αντίστοιχες, θα χρησιμοποιήσουμε την εντολή Append ( a).

Εδώ είναι το αρχείο με το οποίο θα δουλέψουμε:

γάτα geeks.txt

Έχουμε αριθμήσει τις γραμμές για να το κάνουμε λίγο πιο εύκολο να ακολουθηθεί.

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

sed '/ He / a -> Έγινε εισαγωγή!' geeks.txt

Πληκτρολογούμε τα ακόλουθα και συμπεριλαμβάνουμε το Insert Command ( i) για να εισαγάγουμε τη νέα γραμμή πάνω από εκείνες που περιέχουν αντίστοιχο κείμενο:

sed '/ He / i -> Έγινε εισαγωγή!' geeks.txt

Μπορούμε να χρησιμοποιήσουμε το ampersand ( &), το οποίο αντιπροσωπεύει το αρχικό αντιστοιχισμένο κείμενο, για να προσθέσουμε νέο κείμενο σε μια αντίστοιχη γραμμή. \1 ,  \2και ούτω καθεξής, αντιπροσωπεύουν αντίστοιχες υποεκφράσεις.

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

Για να κάνουμε όλα αυτά, πληκτρολογούμε τα εξής:

sed 's /.*/--> Έγινε εισαγωγή & /' geeks.txt

Πληκτρολογούμε τα ακόλουθα, συμπεριλαμβανομένης της Gεντολής, η οποία θα προσθέσει μια κενή γραμμή μεταξύ κάθε γραμμής:

sed 'G' geeks.txt

Αν θέλετε να προσθέσετε δύο ή περισσότερες κενές γραμμές, μπορείτε να χρησιμοποιήσετε G;GG;G;Gκαι ούτω καθεξής.

Διαγραφή γραμμών

Η εντολή Διαγραφή ( d) διαγράφει γραμμές που ταιριάζουν με ένα μοτίβο αναζήτησης ή αυτές που καθορίζονται με αριθμούς ή εύρη γραμμών

Για παράδειγμα, για να διαγράψετε την τρίτη γραμμή, θα πληκτρολογήσουμε τα εξής:

sed '3d' geeks.txt

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

sed '4,5d' geeks.txt

Για να διαγράψουμε γραμμές εκτός εύρους, χρησιμοποιούμε ένα θαυμαστικό ( !), όπως φαίνεται παρακάτω:

sed '6,7! d' geeks.txt

Αποθήκευση των αλλαγών σας

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

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

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

Μπορείτε να χρησιμοποιήσετε την επιλογή In-place ( -i) για  sedνα γράψετε για να γράψετε τις αλλαγές στο αρχικό αρχείο, αλλά αν προσθέσετε μια επέκταση αρχείου σε αυτό, sed θα δημιουργήσει αντίγραφα ασφαλείας του αρχικού αρχείου σε νέο. Θα έχει το ίδιο όνομα με το αρχικό αρχείο, αλλά με μια νέα επέκταση αρχείου.

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

Για να κάνουμε όλα αυτά, πληκτρολογούμε τα εξής:

sed -i'.bak '' /^.*He.*$/d 'geeks.txt

Πληκτρολογούμε τα ακόλουθα για να βεβαιωθούμε ότι το αντίγραφο ασφαλείας μας είναι αμετάβλητο:

γάτα geeks.txt.bak

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

sed -i'.bak "/^.*He.*$/d 'geeks.txt> new_geeks.txt

Χρησιμοποιούμε catγια να επιβεβαιώσουμε ότι οι αλλαγές γράφτηκαν στο νέο αρχείο, όπως φαίνεται παρακάτω:

cat new_geeks.txt

Έχοντας όλα αυτά

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

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