Παραδείγματα Bash Sed

Bash Sed Examples



Το Bash σάς επιτρέπει να εκτελέσετε αντικατάσταση μοτίβου χρησιμοποιώντας μεταβλητή επέκταση όπως ($ {var/pattern/αντικατάσταση}). Και έτσι, κάνει το sed like αυτό (sed -e ‘s/μοτίβο/αντικατάσταση/’). Ωστόσο, υπάρχει περισσότερος τρόπος για να καταπολεμήσετε από την αντικατάσταση μοτίβων σε αρχεία κειμένου. Εδώ θα ανακαλύψουμε ξανά το sed, με παράδειγμα, με ισοδύναμες εντολές και ροές εργασιών που βοηθούν σε καθημερινές εργασίες.

Ρύθμιση για παραδείγματα sed

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







λόγιαείναι ένα αρχείο κειμένου που περιέχει τους αριθμούς 1 έως 100. Εάν δεν είστε βέβαιοι για την εντολή δημιουργίας του, ανατρέξτε στη λειτουργία Εξαγωγή για xargs στην εντολή Bash Export Command. Ποτέ δεν γνωρίζετε ότι μπορεί να βρίσκεται στην επόμενη συνέντευξη σεναρίου για κέλυφος.



μπαρείναι ένα αρχείο κειμένου που περιέχει μία μόνο γραμμή -.



old-phpείναι ένα αρχείο κειμένου που περιέχει γραμμές παλιάς PHP που θα σπάσουν σε php7 ή νεότερη έκδοση. (Υπόδειξη: ereg)





Λάβετε υπόψη ότι όλες οι λειτουργίες που περιγράφονται παραπάνω βρίσκονται παρακάτω στο Endnote σχετικά με τις λειτουργίες για εγκατάσταση.

Παραδείγματα Sed με ισοδύναμες εντολές

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



1. Εκτύπωση τυχαίας γραμμής (ισοδύναμη με ταξινόμηση -R -| κεφαλή -1)

sed '$ ((ΤΥΧΙΚΟ % 100))Π'-

2. Εκτυπώστε την τελευταία γραμμή στο αρχείο (ισοδύναμη με την κεφαλή -1 -)

sed '$ p'-

3. Εκτυπώστε τις πρώτες 10 γραμμές σε ένα αρχείο (ισοδύναμο με το κεφάλι -n 10 -)

sed '10q'-

4. Εκτυπώστε την πρώτη γραμμή σε ένα αρχείο (ισοδύναμο με ουρά -1 -)

sed '1p'-

5. Διαγραφή όλων των εμφανίσεων ενός χαρακτήρα (ισοδύναμο με tr –διαγραφή ‘0’ -, όπου 0 είναι ο χαρακτήρας που θέλουμε να διαγράψουμε)

sed -Και 's / 0 // g'-

6. Μετατροπή αρχείου csv σε tsv (ισοδύναμο με tr ‘,’ ‘ t’ -)

sed -Και 's/,/ t/g'-

7. Προσθέστε τη γραμμή στο αρχείο (ισοδύναμη με τη γραμμή γάτας -)

sed '$ a ---'-

8. Προεπιλογή γραμμής σε αρχείο (ισοδύναμο με γραμμή γάτας)

sed '1i ---'-

9. Εκτυπώστε όλες τις γραμμές στο αρχείο (ισοδυναμεί με γάτα -)

sed -Και 'Π'-

10. Εκτύπωση γραμμών που ταιριάζουν με μοτίβο (ισοδύναμο με grep -e ‘^1’ -)

sed -Και '/^1/ p'-

11. Διαγραφή γραμμών που ταιριάζουν με ένα μοτίβο (ισοδύναμο με grep -v -e ‘^1’ -)

sed -Και '/^1/ d'-

12. Λάβετε τον αριθμό των γραμμών σε ένα αρχείο (ισοδύναμο με wc -l -)

sed -Και '$ ='-

13. Γράψτε σε ένα αρχείο στο παρασκήνιο (ισοδύναμο tee εντολής)

sed 'σε$ {1}'-

Παράδειγμα με χρήση sed για την εφαρμογή της εντολής tee

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

Εντολές

στόχος ()
{
δοκιμή $ {#} -ισοδύναμο 1 || ΕΠΙΣΤΡΟΦΗ?
sed 'σε$ {1}'-
}
κύριος()
στόχοςΑυτό;
ΓάταΑυτό

κύριος

Παραγωγή

1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10

Εδώ θα δείτε δύο καταχωρίσεις των ακεραίων από το 1 έως το 10. Η πρώτη είναι από την εντολή seq. Το δεύτερο παίρνουμε από τη γάτα του αρχείου γραμμένο σε tee. Ξέρω ότι είναι γελοίο αλλά λειτουργεί!

Παράδειγμα με χρήση sed για εκτύπωση τυχαίας γραμμής σε αρχείο

Ας υποθέσουμε ότι θέλουμε να εκτυπώσουμε μια τυχαία γραμμή σε ένα αρχείο χρησιμοποιώντας bash και λίγο sed. Μπορούμε να το κάνουμε; Ναι μπορούμε! Ιδού πώς.

Εφαρμόστε μια συνάρτηση που

  1. Λαμβάνει τον αριθμό των γραμμών σε ένα αρχείο, L
  2. Δημιουργεί έναν τυχαίο αριθμό μεταξύ 1 και L, R
  3. Εκτυπώνει R

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

Εντολές

κάποια γραμμή()
{
λειτουργίαlc()
{
sed -Και '$ ='-
}?
λειτουργίαγραμμή εκτύπωσης()
{
sed -Και '$ {1}Π'-
}?
θερμ= $( mktemp )?
Γάτα->> $ {temp}?
Γάτα $ {temp} |γραμμή εκτύπωσης $((ΤΥΧΑΙΟΣ%$( Γάτα $ {temp} |lc)+1 ))?
rm $ {temp}
}

Παράδειγμα χρήσης (1)

εφ 100 |_

Έξοδος (1)

35

Παράδειγμα χρήσης (2)

μπούκλα https://linuxhint.com/bash_cut_command/ --σιωπηλός |strip-tags|κάποια γραμμή

Δείτε το παρακάτω παράδειγμα, χρησιμοποιώντας το sed για να απογυμνώσετε ετικέτες HTML. Σημειώστε ότι το παράδειγμα over μερικές φορές επιστρέφει κενό για κενές γραμμές. Ως άσκηση, μπορεί να βελτιωθεί.

Χρήση sed για εκτύπωση γραμμών σε αρχείο

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

Εντολές

γραμμή εκτύπωσης()
{
sed '$ {1}Π'-
}

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

Εντολές

λόγια|γραμμή εκτύπωσηςπενήντα

Παραγωγή

πενήντα

Εντάξει. Φαίνεται καλό, αλλά ας δοκιμάσουμε κάτι που φαίνεται λίγο λιγότερο ασήμαντο.

Εντολές

δηλώνω -χφλόγια
δηλώνω -χφγραμμή εκτύπωσης
εφ 1 10$(λόγια| τουαλέτα -ο ) | xargs-Εγώκτυπώ δυνατά -ντο «λόγια | γραμμή εκτύπωσης {} '

Παραγωγή

1
έντεκα
είκοσι ένα
31
41
51
61
71
81
91

Εντάξει. Τώρα αυτό μοιάζει περισσότερο! Βλέπετε πώς το sed μπορεί να χρησιμοποιηθεί σε ένα σενάριο bash για να εκτυπώσετε οποιαδήποτε γραμμή σε ένα αρχείο.

Παραδείγματα Sed χωρίς ισοδύναμες εντολές

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

Εντολή σε όλες τις γραμμές σε ένα σενάριο κελύφους

sed -Και 's/^/#/'-
Διαγράψτε την πρώτη γραμμή
sed -Και '1d'-
Διαγράφωτελευταίοςγραμμή
sed -Και '$ d'-
Εισαγάγετε μια γραμμή πριν από γραμμές που ταιριάζουν με ένα μοτίβο
sed '/0 $/i ---'-
Εισαγάγετε μια γραμμή μετά από γραμμές που ταιριάζουν με ένα μοτίβο
sed ' / 0 $ / ---'-
Αφαιρέστε τις ετικέτες html
sed -Και 's /†*.// g'-
Αναβάθμιση eregσεπαλιό κώδικα php για εκτέλεσησεphp7 ή μεταγενέστερο
sed 's/ereg ( ([^,]*). ([^)]*) ./ strpos ( 2, 1)/g'
Ελεγχοςαν sedείναι παλαιότερη από μια συγκεκριμένη έκδοση
sed -Και 'v 4.5'-

Παράδειγμα sed version διακλάδωση σε bash

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

Εντολές

test-sed-version-at-most() {
πέταξε έξω | sed 'v$ {1}'-2> /dev/μηδενικό
}
δοκιμαστική έκδοση()
{
πέταξε έξω 'Εκδοχή$ {1}Το Εντάξει. Κάντο το '?
test-sed-version-at-most$ {1} && {
πέταξε έξω 'παλαιός'?
αληθής
} || {
πέταξε έξω 'νέος'
}?
πέταξε έξω ' τρόπος.'
}
κύριος()
{
τοπικόςv;
Γιαvσε 4Το{4,5}?
κάνω
δοκιμαστική έκδοση$ {v}?
Έγινε
}
κύριος

Παραγωγή

Εκδοχή4.4Το Εντάξει. Κάντε το με τον παλιό τρόπο.
Εκδοχή4.5Το Εντάξει. Κάντε το με τον νέο τρόπο.

Σημειώστε ότι η έκδοση του sed που εκτελείται στο μηχάνημά μου κατά την πληκτρολόγηση αυτών των χαρακτήρων είναι 4.4, κάτι που θα εξηγούσε την παραπάνω έξοδο. Επίσης, ταυτόχρονα, η τελευταία έκδοση του gnu sed ήταν 4,7, περίπου 3 χρόνια παλαιότερη από αυτήν που έχω. Το sed μου είναι παλιό! Στην πραγματικότητα, στο sed 4.0.6, μια παράμετρος προστέθηκε στην εντολή έκδοσης, έτσι ώστε αυτή η στρατηγική να λειτουργεί για κάθε προαναφερθείσα τουλάχιστον έκδοση v4.0.6, η οποία είναι επιεικής δεδομένου ότι η έκδοση κυκλοφόρησε στις αρχές του 2003. Είστε καλοί.

Έκανα κάποιο επιπλέον σκάψιμο, στην πραγματικότητα διαβάζοντας ΝΕΑ από τον τελευταίο πηγαίο κώδικα. Η έκδοση 4.6 διαθέτει μια νέα δυνατότητα, το σφάλμα - debug, το οποίο απορρίπτει το σενάριο και σχολιάζει τις γραμμές εξόδου. Αυτό θα σας επιτρέψει να μεταφράσετε σενάρια σεντ που δημιουργούνται από συναρτήσεις σε bash σε κανονική μορφή. Δροσερός! Απλώς μην ξεχνάτε ότι χρειάζεστε έκδοση sed που διακλαδίζεται σε bash. Εκεί μπαίνει στο παιχνίδι αυτό το sed παράδειγμα.

Παράδειγμα λειτουργίας bash χρησιμοποιώντας sed για απογύμνωση ετικετών HTML

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

Εντολές

strip-tags()
{
sed -Και 's /†*.// g'-
}
μπούκλα https://linuxhint.com/bash_cut_command/ --σιωπηλός |strip-tags

Δεν μπορώ να πω ότι είναι τέλειο, αλλά τουλάχιστον διαβάζεται στο τερματικό.

Παραδείγματα Sed με ροές εργασίας: Παράδειγμα ροής εργασίας: αντικαταστήστε με ασφάλεια όλα τα εύρεση, grep και sed

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

Ροή εργασίας

  1. εύρημα
  2. λαβή
  3. sed
εύρημα

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

εύρημα -τύποςφά-όνομα | λαβή -v-Και| xargs-Εγώ ...

Για παράδειγμα, μπορεί να θέλετε να περιορίσετε τα αρχεία για να αντικαταστήσετε αρχεία PHP εξαιρουμένων των καταλόγων git repository ως εξής.

εύρημα -τύποςφά-όνομα*.php| λαβή -v -Και '.πηγαίνω' | xargs -Εγώ...

Διαβάστε περισσότερα για την εντολή xargs στο bash.

λαβή

Στη συνέχεια, θα προσπαθήσουμε να ταιριάξουμε some_pattern στα αρχεία που επιλέγονται ως εξής. Λάβετε υπόψη ότι επειδή χρησιμοποιούμε την επιλογή -o για grep, η έξοδος θα εμφανίζει μόνο αντιστοιχισμένη συμβολοσειρά, εάν υπάρχει.

εύρημα -τύποςφά-όνομα*.php| λαβή -v -Και '.πηγαίνω' |
xargs -Εγώ λαβή -Καιsome_pattern

Η παραπάνω εντολή θα πρέπει να επιστρέψει μια λίστα συμβολοσειρών που ταιριάζει με some_pattern.

sed

Τέλος, θέλουμε να αντικαταστήσουμε όλες τις συμβολοσειρές που ταιριάζουν σε κάποιο_προτύπο. Για να γίνει αυτό πρέπει να μετατρέψουμε το grep σε sed ως εξής.

εύρημα -τύποςφά-όνομα*.php| λαβή -v -Και '.πηγαίνω' |
xargs -Εγώ sed -Εγώ -Καιμικρό/some_pattern/αντικατάσταση/σολ

Η εντολή grep γίνεται sed -i και η επιλογή -o αφαιρείται. Και εκεί το έχετε.

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

Σημειώσεις για τις επιλογές που χρησιμοποιούνται σε παραδείγματα

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

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

Ο Σεντ δέχεται ένα

π.χ.) sed -n…

-Και -e σημαίνει έκφραση. Η παράμετρος του είναι μια έκφραση στη γλώσσα sed.

Ο Σεντ δέχεται πολλούς

π.χ.) sed -e'expr1 '-e'expr2'

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

π.χ.) sed -n…

Για περισσότερες πληροφορίες σχετικά με τις διαθέσιμες επιλογές sed, ανατρέξτε στο sed –help

Τέλος σημειώσεων για ισοδύναμες εντολές που χρησιμοποιούνται σε παραδείγματα

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

  • είδος
  • κεφάλι
  • ουρά
  • λαβή
  • Γάτα
  • NS
  • στόχος

Σημείωση για το τέλος - για παράδειγμα ισοδύναμες εντολές

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

Γάτακάποιο αρχείο| είδος -| κεφάλι -1

Ωστόσο, όταν υπάρχει η εντολή στο αριστερό χέρι ο σωλήνας, μπορούμε να παραλείψουμε την υπόδειξη ως εξής.

Γάτακάποιο αρχείο| είδος | κεφάλι -1

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

Σημειώσεις για τις λειτουργίες για ρύθμιση

Σε περίπτωση που ψάχνετε, εδώ είναι συναρτήσεις στη ρύθμιση για τα παραπάνω παραδείγματα. Η έξοδος που λαμβάνεται με τη δήλωση -f. Διαβάστε περισσότερα σχετικά με την εντολή δήλωσης σε bash για περισσότερες χρήσεις.

Εντολές

λόγια()
{
εφ 100
}
μπαρ()
{
πέταξε έξω ---
}
old-php()
{
πέταξε έξω 'ereg ($ UA,' Bottybot ')'
}

Συμπέρασμα

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