Οδηγός αρχαρίων για Sed [Linux]
Μετά από grep, το επόμενο λογικό βήμα είναι ένα tutorial στο sed. Η εντολή sed προέρχεται από το Stream EDitor και, όπως υποδηλώνει το όνομά του, ασχολείται με τη ροή κειμένου. Ωστόσο, αν το sed είναι μία από τις πιο ισχυρές εντολές στο Unix, η σελίδα του εγχειριδίου είναι επίσης από τις πιο αινιγματικές. Θα προσπαθήσω σε αυτό το άρθρο να συνοψίσω την πιο βασική χρήση του sed και στη συνέχεια να σας δώσω μερικά παραδείγματα προηγμένων σεναρίων.
Βασικά
Η γενική εντολή για sed είναι κάτι σαν:
sed [επιλογή] '{script}' [αρχείο κειμένου]
Το Sed θα εκτελέσει τις λειτουργίες που θέλετε να κάνει στο αρχείο κειμένου και θα εμφανίσει το αποτέλεσμα στην τυπική έξοδο. Αν θέλετε το αποτέλεσμα σε ένα αρχείο κειμένου, μπορείτε είτε να το ανακατευθύνετε μέσω της συνήθης μεθόδου:
sed [επιλογή] '{script}' [αρχείο κειμένου]> [αρχείο επεξεργασμένου κειμένου]
Ή χρησιμοποιήστε την επιλογή " -i
" που θα επεξεργαστεί άμεσα το αρχείο εισόδου:
sed -i [επιλογή] '{script}' [αρχείο κειμένου]
Τώρα ας αρχίσουμε να εργαζόμαστε στο σενάριο. Το πιο προφανές πρώτο βήμα είναι το μηδενικό script:
sed '' test.txt
θα εμφανίσει ακριβώς το κείμενο στο test.txt.
Μια καλή χρήση του sed είναι διαγραφή. Ας ασκηθούμε μέσω παραδειγμάτων.
sed '2, 4 d' test.txt
θα διαγράψει τις γραμμές 2 έως 4 του test.txt.
Μπορείτε να υποθέσετε ότι η σύνταξη για το σενάριο είναι:
sed '[πρώτη γραμμή για διαγραφή] [τελευταία γραμμή για διαγραφή] d' test.txt
Αλλά το κομψό μέρος έρχεται όταν χρησιμοποιείτε κανονικές εκφράσεις, ή regex, ως οριοθέτη για τη διαγραφή. Για παράδειγμα,
sed '/ ^ # / d' test.txt
θα διαγράψει κάθε γραμμή που αρχίζει με "#" (με άλλα λόγια, αν κωδικοποιήσετε, θα διαγράψει όλα τα σχόλιά σας).
Η γενική σύνταξη είναι
sed '/ regex / d' test.txt
για τη διαγραφή της γραμμής που περιέχει την επαναφορά.
sed '/ regex1 /, / regex2 / d' test.txt
για τη διαγραφή του διαστήματος από τη γραμμή που περιέχει regex1 στη γραμμή που περιέχει regex2.
Ο ειδικός χαρακτήρας "^" που χρησιμοποίησα στο πρώτο παράδειγμα είναι να υποδείξω την αρχή της γραμμής.
Στη συνέχεια, η δεύτερη βασική χρήση που μπορώ να σκεφτώ είναι αντικατάσταση. Η γενική σύνταξη είναι:
sed -re 's / regex1 / regex2 /' test.txt
Θα έχει ως αποτέλεσμα την αναζήτηση στην πρώτη γραμμή για το regex1, την αντικατάσταση με regex2, μετάβαση στην επόμενη γραμμή και επανάληψη μέχρι το τέλος της ροής εισόδου.
Ένα καλό παράδειγμα είναι:
sed -re 's / ^ # * //' test.txt
Θα αντικαταστήσει το σύμβολο "#" στην αρχή μιας γραμμής και όλα τα κενά κενά με τίποτα. Με άλλους όρους, αποσυνδέει το αρχείο κειμένου. Το σύμβολο "*" είναι μετα-χαρακτήρας που σχεδιάζει 0 ή περισσότερα κενά κενά εδώ.
Προχωρημένος
Μπορείτε να κάνετε κάποια αρκετά φανταχτερά πράγματα με sed, αλλά θα φτάσετε στο όριο αρκετά γρήγορα αν δεν δώσετε προσοχή στη βασική συμπεριφορά του. Sed ασχολείται με τη ροή γραμμικά: Εφαρμόζει μια επεξεργασία γραμμής ανά γραμμή σε ένα αρχείο κειμένου. Εάν θέλετε να κάνετε περισσότερες από μία τροποποιήσεις σε μια ίδια γραμμή, πρέπει να χρησιμοποιήσετε ετικέτες και επεξεργασία πολλαπλών γραμμών. Όλα αυτά μπορούν να γίνουν πολύ σύνθετα, πολύ γρήγορα. Θα σας δείξω τώρα μερικά προηγμένα παραδείγματα και θα σας τα εξηγήσω. Εάν θέλετε περισσότερα, είμαι βέβαιος ότι μπορείτε να ψάξετε μόνοι σας και να χρησιμοποιήσετε τα βασικά που σας έδωσα.
Εάν θέλετε να διαγράψετε τις κενές γραμμές ενός αρχείου, μπορείτε να χρησιμοποιήσετε την εντολή
sed -re '/ ^ $ / {N; D} 'test.txt
Ο μετα-χαρακτήρας "$" σημαίνει το τέλος της γραμμής, έτσι το "^ $" σχεδιάζει μια κενή γραμμή. Στη συνέχεια, "{N; D}" είναι μια αρκετά σύνθετη σύνταξη για να λέει ότι διαγράφεται αυτή η γραμμή.
Εάν θέλετε να διαγράψετε κάθε ετικέτα σε ένα αρχείο html, αυτή είναι η εντολή για εσάς:
sed -re ': έναρξη s /] *> // g; / /Το ": start" ονομάζεται ετικέτα. Είναι λίγο σαν μια ετικέτα μέσα στο σενάριο που θέλουμε να επιστρέψουμε αργότερα για να εφαρμόσουμε πολλαπλές αλλαγές σε μια ίδια γραμμή. sed ψάχνει για οτιδήποτε από τη φόρμα "" (το regex] *>) και την αντικαθιστά με τίποτα, έτσι ώστε να διαγραφεί η πρώτη ετικέτα html της γραμμής. Στη συνέχεια, πριν πάτε στην επόμενη γραμμή, ελέγχει αν υπάρχει κάτι άλλο που ξεκινάει με "<" και αν υπάρχει, πηγαίνει πίσω στην ετικέτα ": start" και εφαρμόζει ξανά τη θεραπεία.
συμπέρασμα
Είστε έτοιμοι να μελετήσετε πιο βαθιά, ή απλά να το χρησιμοποιήσετε για απλές τροποποιήσεις. Είναι μια εντολή που θεωρώ ιδιαίτερα χρήσιμη σε σενάρια γενικά, αλλά μου πήρε λίγο χρόνο για να καταλάβω τη σύνταξη της. Ελπίζω ότι θα είναι πολύ γρηγορότερο για εσάς.
Ξέρετε μια άλλη βασική εντολή για το sed; Ή χρησιμοποιείτε ένα άλλο προηγμένο σενάριο που περιλαμβάνει sed που θέλετε να μοιραστείτε; Ενημερώστε μας στα σχόλια.