Σε ορισμένες περιπτώσεις πρέπει να διαγράψουμε μια συγκεκριμένη γραμμή από ένα αρχείο ή περισσότερα, για παράδειγμα, μου συνέβη ότι είχα μια ολόκληρη λίστα αρχείων και πρέπει να διαγράψω τη γραμμή # 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 😉
αφορά
16 σχόλια, αφήστε τα δικά σας
Πολύ καλή συνεισφορά 😉
Σας ευχαριστώ
Παρεμπιπτόντως, λάβαμε το email σας τώρα και θα σας απαντήσω 😀
αφορά
Ως αρχιερέας του τερματικού σταθμού, των διακομιστών και των συνδέσεων ssh έρχομαι σε εσένα, ω, υπέροχο KZKG ^ Gaara, και σας ρωτώ: από πού μπορώ να βρω ένα σεμινάριο στο επίπεδο της άγνοιάς μου που μου επιτρέπει να χρησιμοποιώ συνδέσεις ssh μεταξύ δύο απομακρυσμένων μηχανών σε διαφορετικά δίκτυα για κοινή χρήση αρχείων κειμένου, pdf, εικόνας και ήχου (mp3)….
????
Σοβαρά, θα μπορούσατε να με καθοδηγήσετε σε αυτό το θέμα, έχω δύο μηχανήματα, ένα στη δουλειά και ένα στο σπίτι και χρειάζομαι μια σύνδεση ssh μεταξύ τους (επειδή, όπως το καταλαβαίνω, το ssh επιτρέπει την κοινή χρήση περιεχομένου μεταξύ των μηχανών, σωστά;).
Και αν κάνω λάθος, ποια εφαρμογή προτείνετε;
Και πού μπορώ να βρω ένα βασικό σεμινάριο σχετικά με αυτό;
scp
scp user @ machine_address: path user @ machine_address: διαδρομή.
Ίδια σύνταξη με cp, πηγή -> προορισμός.
Εμφανίστηκε ο άνθρωπος, χάσατε.
Καλή συμβουλή!
Ενδιαφέρουσα συμβουλή… xD
Μήπως ξέρετε κάποιο που κάνει το έντονο κείμενο να ξεχωρίζει;
Θέλω να πω, έχω ένα αρχείο txt που είναι λεξικό, έχει περισσότερες από 10000 γραμμές και θέλω να επισημάνει συγκεκριμένο κείμενο πριν από τα σημεία αναστολής ":" και να το κάνω ένα προς ένα είναι υπερβολικά.
Γεια σας,
Ένα αρχείο txt είναι απλό κείμενο, όπως υποδηλώνει το όνομα ... απλό, χωρίς μορφές ή κάτι παρόμοιο, λυπάμαι αλλά νομίζω ότι αυτό που ζητάτε δεν μπορεί να γίνει, έτσι; 🙁
αφορά
στην πραγματικότητα μπορεί, αλλά θα πρέπει να γνωρίζετε τη μορφή προορισμού.
π.χ:
echo $ (echo "Robert: Γεια. Αλλαγή εδώ" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
είναι θέμα αντιμετώπισης.
ο άλλος τρόπος διαγραφής που μπορεί να χρησιμοποιηθεί είναι sed '/' $ 1 '/ d' αλλά πρέπει να είστε σίγουροι για το re.
στη συνέχεια ολοκληρώστε την αποθήκευση σε * .odt
Δεν υπάρχει ευκολότερος τρόπος να το κάνετε με το LibreOffice;
Θα μπορούσατε να διαγράψετε μέρος μιας γραμμής και να αφήσετε τα υπόλοιπα;
Ας πούμε ότι θέλω να διαγράψω τα πάντα μπροστά από μια λέξη σε μια συγκεκριμένη σειρά.
Ή διαγράψτε όλα όσα ακολουθούν αυτήν τη λέξη.
Ναι, πρόκειται για τράβηγμα ενός 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 / Αλλαγή. * //'
Σας ευχαριστώ, είναι πολύ χρήσιμο για μένα.
Ωραίο άρθρο, από το οποίο μου αρέσει, πόσο υπέροχο είναι το SysAdmin!
Ποια θα ήταν η ζωή μας χωρίς sed, awek, perl, grep, tail, head, "Emacs" και τόσα πολλά άλλα απαραίτητα εργαλεία !;
Ευχαριστώ, ήταν πολύ χρήσιμο.
Γεια σας, και πώς θα μπορούσατε να διαγράψετε τις γραμμές 1,4 και 10 στην ίδια εντολή από ένα αρχείο;