Πώς να διαγράψετε συγκεκριμένες γραμμές από ένα αρχείο χρησιμοποιώντας το sed

Σε ορισμένες περιπτώσεις πρέπει να διαγράψουμε μια συγκεκριμένη γραμμή από ένα αρχείο ή περισσότερα, για παράδειγμα, μου συνέβη ότι είχα μια ολόκληρη λίστα αρχείων και πρέπει να διαγράψω τη γραμμή # 27 όλων αυτών (η γραμμή # 27 είναι αυτή ενός ACL , κανόνας, κανόνας, διαμόρφωση), είτε μπορώ να επεξεργαστώ αρχείο με αρχείο είτε μπορώ να επιτύχω ό, τι χρειάζομαι χρησιμοποιώντας την εντολή δίψα και ένα σενάριο bash (προαιρετικό).

Αλλά, ας δοκιμάσουμε ένα μόνο αρχείο κάπως απλό.

Έχουμε το αρχείο distros-deb.txt που περιέχει αυτό:

debian

kubuntu

archlinux

λύσεις

μέντα

Με άλλα λόγια, το αρχείο distros-deb.txt είναι στο οποίο θα τοποθετήσουμε τις διανομές που βασίζονται στο Debian, αλλά εκεί βλέπουμε ότι στη γραμμή # 3 υπάρχει το "archlinux", μια διανομή που προφανώς δεν έχει καμία σχέση με το Debian, οπότε πρέπει να εξαλείψουμε αυτή τη γραμμή. Για να εξαλείψουμε τη γραμμή # 3 αυτού του αρχείου θα θέσουμε τα εξής:

sed "3d" distros-deb.txt > distros-deb-ok.txt

Η εξήγηση αυτής της γραμμής είναι κάπως εύκολη, με διψασμένος "τρισδιάστατος" δηλώνουμε ότι θα διαγράψουμε τη γραμμή # 3, με distros-deb.txt Υποδεικνύουμε σε ποιο αρχείο θα δουλέψουμε, δηλαδή, διαγράψτε τη γραμμή # 3 αυτού του αρχείου, μέχρι εδώ αν πατήσουμε Enter θα μας δείξει τι θέλουμε, αλλά στο τερματικό, έτσι με > distros-deb-ok.txt δηλώνουμε ότι αντί να δείξουμε το αποτέλεσμα στο τερματικό, ότι το έβαλε σε ένα αρχείο με αυτό το όνομα.

Τι είναι απλό;

Επίσης, μπορούμε να αποφύγουμε τη χρήση του > distros-deb-ok.txt χρησιμοποιώντας μια σωστή παράμετρο του δίψα, η παράμετρος -i

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

sed -i "3d" distros-deb.txt

Αυτό θα αφαιρέσει τη γραμμή # 3 από το distros-deb.txt και θα την αποθηκεύσει.

Τι γίνεται αν θέλω μια σειρά γραμμών, δηλαδή να αφαιρέσω τη γραμμή # 3 αλλά και # 4 και # 5; Για να το επιτύχουμε αυτό θέτουμε το εύρος από 3 έως 5, δηλαδή:

sed -i "3,5d" distros-deb.txt

Και θα μου δείξει μόνο το debian και το kubuntu 😀

Τι γίνεται λοιπόν αν θέλω να διαγράψω από τη γραμμή 2 στην τελευταία, όταν δεν ξέρω τις συνολικές γραμμές;

Απλώς χρησιμοποιήστε το σύμβολο δολαρίου - »$

sed -i "2,$d" distros-deb.txt

Σε περίπτωση που θέλετε να καταργήσετε από την πρώτη γραμμή στο # 4, τότε απλώς βάζουμε την τιμή 1 στην αρχή:

sed -i "1,4d" distros-deb.txt

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

αφορά


Το περιεχόμενο του άρθρου συμμορφώνεται με τις αρχές μας συντακτική ηθική. Για να αναφέρετε ένα σφάλμα κάντε κλικ Aquí.

16 σχόλια, αφήστε τα δικά σας

Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   mss-devel dijo

    Πολύ καλή συνεισφορά 😉

    1.    KZKG ^ Γκάρα dijo

      Σας ευχαριστώ

      Παρεμπιπτόντως, λάβαμε το email σας τώρα και θα σας απαντήσω 😀

      αφορά

  2.   ανώνυμος dijo

    Ως αρχιερέας του τερματικού σταθμού, των διακομιστών και των συνδέσεων ssh έρχομαι σε εσένα, ω, υπέροχο KZKG ^ Gaara, και σας ρωτώ: από πού μπορώ να βρω ένα σεμινάριο στο επίπεδο της άγνοιάς μου που μου επιτρέπει να χρησιμοποιώ συνδέσεις ssh μεταξύ δύο απομακρυσμένων μηχανών σε διαφορετικά δίκτυα για κοινή χρήση αρχείων κειμένου, pdf, εικόνας και ήχου (mp3)….

    ????

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

    1.    -spyker- dijo

      scp

      scp user @ machine_address: path user @ machine_address: διαδρομή.

      Ίδια σύνταξη με cp, πηγή -> προορισμός.

  3.   f3niX dijo

    Εμφανίστηκε ο άνθρωπος, χάσατε.

  4.   Joaquin dijo

    Καλή συμβουλή!

  5.   LycusHackerEmo dijo

    Ενδιαφέρουσα συμβουλή… xD

    Μήπως ξέρετε κάποιο που κάνει το έντονο κείμενο να ξεχωρίζει;
    Θέλω να πω, έχω ένα αρχείο txt που είναι λεξικό, έχει περισσότερες από 10000 γραμμές και θέλω να επισημάνει συγκεκριμένο κείμενο πριν από τα σημεία αναστολής ":" και να το κάνω ένα προς ένα είναι υπερβολικά.

    1.    KZKG ^ Γκάρα dijo

      Γεια σας,

      Ένα αρχείο txt είναι απλό κείμενο, όπως υποδηλώνει το όνομα ... απλό, χωρίς μορφές ή κάτι παρόμοιο, λυπάμαι αλλά νομίζω ότι αυτό που ζητάτε δεν μπορεί να γίνει, έτσι; 🙁

      αφορά

      1.    aca dijo

        στην πραγματικότητα μπορεί, αλλά θα πρέπει να γνωρίζετε τη μορφή προορισμού.
        π.χ:
        echo $ (echo "Robert: Γεια. Αλλαγή εδώ" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        είναι θέμα αντιμετώπισης.
        ο άλλος τρόπος διαγραφής που μπορεί να χρησιμοποιηθεί είναι sed '/' $ 1 '/ d' αλλά πρέπει να είστε σίγουροι για το re.

        1.    LycusHackerEmo dijo

          στη συνέχεια ολοκληρώστε την αποθήκευση σε * .odt

          Δεν υπάρχει ευκολότερος τρόπος να το κάνετε με το LibreOffice;

  6.   Lolo dijo

    Θα μπορούσατε να διαγράψετε μέρος μιας γραμμής και να αφήσετε τα υπόλοιπα;

    Ας πούμε ότι θέλω να διαγράψω τα πάντα μπροστά από μια λέξη σε μια συγκεκριμένη σειρά.

    Ή διαγράψτε όλα όσα ακολουθούν αυτήν τη λέξη.

    1.    aca dijo

      Ναι, πρόκειται για τράβηγμα ενός regex (αν είναι απαραίτητο man sed -r, –regexp-extended)
      Ξεκινώντας από αυτό που βρίσκω
      echo «Robert: Γεια σας. Αλλαγή εδώ »| sed 's / Αλλαγή //'
      με ένα καλά καθορισμένο μοτίβο και με. (ένας χαρακτήρας) και * (περισσότεροι από ένας)
      Μετά από:
      echo «Robert: Γεια σας. Αλλαγή εδώ »| sed / Αλλαγή. * //
      Πριν:
      echo «Robert: Γεια σας. Αλλαγή εδώ »| sed 's /. * Αλλαγή //'
      Εάν έχει σημασία ότι εμφανίζεται η λέξη
      echo «Robert: Γεια σας. Αλλαγή εδώ »| sed / Αλλαγή. * / Αλλαγή / '
      ή πιο περίτεχνα
      στη γραμμή που περιέχει τον Ρόμπερτ τι ακολουθεί το Change
      echo -e «Fritz: Γεια σας. Αλλαγή εδώ \ nRobert: Γεια σας. Αλλαγή εδώ »| sed '/Robert/s/Cambio.*//'
      ή όπως στην αρχή βγάλτε τη δεύτερη γραμμή και επεξεργαστείτε τα υπόλοιπα
      echo -e «Fritz: Γεια σας. Αλλαγή εδώ \ nRobert: Γεια σας. Αλλαγή εδώ \ nΆλλα »| sed -e 2d -e / Αλλαγή. * // '
      echo -e «Fritz: Γεια σας. Αλλαγή εδώ \ nRobert: Γεια σας. Αλλαγή εδώ \ nΆλλα »| sed '2d; s / Αλλαγή. * //'

      1.    Lolo dijo

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

  7.   MSX dijo

    Ωραίο άρθρο, από το οποίο μου αρέσει, πόσο υπέροχο είναι το SysAdmin!
    Ποια θα ήταν η ζωή μας χωρίς sed, awek, perl, grep, tail, head, "Emacs" και τόσα πολλά άλλα απαραίτητα εργαλεία !;

  8.   Λίσμπεθ Ολάρβες dijo

    Ευχαριστώ, ήταν πολύ χρήσιμο.

  9.   Πέρνι dijo

    Γεια σας, και πώς θα μπορούσατε να διαγράψετε τις γραμμές 1,4 και 10 στην ίδια εντολή από ένα αρχείο;