Android

Πώς να χρησιμοποιήσετε το sed για να βρείτε και να αντικαταστήσετε τη συμβολοσειρά στα αρχεία

Γαλιλαίος: Η Μάχη στην Αυγή της Σύγχρονης Επιστήμης| Galileo: Fighting in the Dawn of Modern Science

Γαλιλαίος: Η Μάχη στην Αυγή της Σύγχρονης Επιστήμης| Galileo: Fighting in the Dawn of Modern Science

Πίνακας περιεχομένων:

Anonim

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

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

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

Βρείτε και αντικαταστήστε το String με sed

Υπάρχουν πολλές εκδόσεις sed , με ορισμένες λειτουργικές διαφορές μεταξύ τους. Το macOS χρησιμοποιεί την έκδοση BSD και οι περισσότερες διανομές Linux έρχονται προεγκατεστημένες από προεπιλογή του GNU sed . Θα χρησιμοποιήσουμε την έκδοση GNU.

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

sed -i 's/SEARCH_REGEX/REPLACEMENT/g' INPUTFILE

  • -i - Από προεπιλογή το sed γράφει την έξοδο του στην τυπική έξοδο. Αυτή η επιλογή λέει sed για να επεξεργαστείτε τα αρχεία στη θέση τους. Εάν παρέχεται μια επέκταση (ex-i.bak) θα δημιουργηθεί αντίγραφο ασφαλείας του αρχικού αρχείου. s - Η εντολή υποκατάστασης, πιθανώς η πιο χρησιμοποιούμενη εντολή στο sed. / / / - Χαρακτήρας οριοθέτησης. Μπορεί να είναι οποιοσδήποτε χαρακτήρας, αλλά συνήθως χρησιμοποιείται ο χαρακτήρας ( / ). SEARCH_REGEX - Κανονική συμβολοσειρά ή κανονική έκφραση για αναζήτηση. REPLACEMENT - Η συμβολοσειρά αντικατάστασης. g - Παγκόσμια σημαία αντικατάστασης. Από προεπιλογή, το sed διαβάζει τη γραμμή αρχείου κατά γραμμή και αλλάζει μόνο την πρώτη εμφάνιση του SEARCH_REGEX σε μια γραμμή. Όταν παρέχεται η σημαία αντικατάστασης, όλα τα συμβάντα θα αντικατασταθούν. INPUTFILE - Το όνομα του αρχείου στο οποίο θέλετε να εκτελέσετε την εντολή.

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

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

Για σκοπούς επίδειξης, θα χρησιμοποιήσουμε το ακόλουθο αρχείο:

file.txt

123 Foo foo foo foo /bin/bash Ubuntu foobar 456

sed -i 's/foo/linux/' file.txt

123 Foo linux foo linux /bin/bash Ubuntu foobar 456

Με τη σφαιρική σημαία αντικατάστασης αντικαθιστώνται όλες οι εμφανίσεις του μοτίβου αναζήτησης:

sed -i 's/foo/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu linuxbar 456

Όπως ίσως έχετε παρατηρήσει, στο προηγούμενο παράδειγμα η υποκατηγορία foo στο foobar string αντικαθίσταται επίσης. Εάν αυτή δεν είναι η επιθυμητή συμπεριφορά, χρησιμοποιήστε την έκφραση δεσμών λέξεων ( \b ) και στα δύο άκρα της συμβολοσειράς αναζήτησης. Αυτό εξασφαλίζει ότι οι μερικές λέξεις δεν ταιριάζουν.

sed -i 's/\bfoo\b/linux/g' file.txt

123 Foo linux linux linux /bin/bash Ubuntu foobar 456

Για να μην είναι ευαίσθητη η περίπτωση αντιστοίχισης μοτίβου, χρησιμοποιήστε τη σημαία I Στο παρακάτω παράδειγμα χρησιμοποιούμε τις σημαίες g και I :

sed -i 's/foo/linux/gI' file.txt

123 linux linux linux linux /bin/bash Ubuntu linuxbar 456

sed -i 's/\/bin\/bash/\/usr\/bin\/zsh/g' file.txt

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

sed -i 's|/bin/bash|/usr/bin/zsh|g' file.txt

123 Foo foo foo foo /usr/bin/zsh Ubuntu foobar 456

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

sed -i 's/\b\{3}\b/number/g' file.txt

number Foo foo foo foo /bin/bash demo foobar number

Ένα άλλο χρήσιμο χαρακτηριστικό του sed είναι ότι μπορείτε να χρησιμοποιήσετε τον χαρακτήρα ampersand & που αντιστοιχεί στο αντιστοιχισμένο μοτίβο. Ο χαρακτήρας μπορεί να χρησιμοποιηθεί πολλές φορές.

Για παράδειγμα, εάν θέλετε να προσθέσετε σγουράκια {} γύρω από κάθε 3ψήφιο αριθμό, πληκτρολογήστε:

sed -i 's/\b\{3}\b/{&}/g' file.txt

{123} Foo foo foo foo /bin/bash demo foobar {456}

Τελευταίο αλλά όχι ασήμαντο, είναι πάντα μια καλή ιδέα να κάνετε ένα αντίγραφο ασφαλείας κατά την επεξεργασία ενός αρχείου με sed . Για να γίνει αυτό, απλώς παρέχετε μια επέκταση στην επιλογή -i . Για παράδειγμα, για να επεξεργαστείτε το file.txt και να αποθηκεύσετε το αρχικό αρχείο ως file.txt.bak θα χρησιμοποιούσατε:

sed -i.bak 's/foo/linux/g' file.txt

ls

file.txt file.txt.bak

Αναδρομική Εύρεση και Αντικατάσταση

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

Η ακόλουθη εντολή θα αναζητήσει αναδρομικά αρχεία στον τρέχοντα κατάλογο εργασίας και θα μεταβιβάσει τα ονόματα αρχείων σε sed .

find. -type f -exec sed -i 's/foo/bar/g' {} +

Για να αποφύγετε προβλήματα με αρχεία που περιέχουν χώρο στα ονόματά τους, χρησιμοποιήστε την επιλογή -print0 που λέει find για να εκτυπώσετε το όνομα του αρχείου, ακολουθούμενη από έναν μηδενικό χαρακτήρα και σωλήνα, την έξοδο προς sed χρησιμοποιώντας xargs -0 :

find. -type f -print0 | xargs -0 sed -i 's/foo/bar/g'

Για να αποκλείσετε έναν κατάλογο, χρησιμοποιήστε την επιλογή -not -path . Για παράδειγμα, εάν αντικαθιστάτε μια συμβολοσειρά στο τοπικό git repo για να αποκλείσετε όλα τα αρχεία που ξεκινούν με dot ( . ), Χρησιμοποιήστε:

find. -type f -not -path '*/\.*' -print0 | xargs -0 sed -i 's/foo/bar/g'

find. -type f -name "*.md" -print0 | xargs -0 sed -i 's/foo/bar/g'

Μια άλλη επιλογή είναι να χρησιμοποιήσετε την εντολή grep για να βρείτε αναδρομικά όλα τα αρχεία που περιέχουν το πρότυπο αναζήτησης και στη συνέχεια να διοχετεύσετε τα ονόματα αρχείων σε sed :

grep -rlZ 'foo'. | xargs -0 sed -i.bak 's/foo/bar/g'

συμπέρασμα

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

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

sed