Vim tricks: Ευρεση και αντικατάσταση χαρακτήρα σε plain text κείμενο

dimitris | Παρ, 01/17/2014 - 15:03 | 2' | 1

Ενα από τα τυπικά πράγματα που ένας χρήστης μπορεί να χρειαστεί να κάνει στην καθημερινότητα του είναι να επεξεργαστεί ένα μεγάλο αρχείο κειμένου και να αντικαταστήσει κάποιον χαρακτήρα με έναν άλλο.

Στο Vim, βρίσκουμε και αντικαθιστούμε χαρακτήρα πατώντας Esc και μετά : για να μπούμε σε περιβάλλον εντολών. Μετά γράφουμε μια εντολή της μορφή:

%s/αρχικό/τελικό/g

Εδώ το %s λέει στο vim να ψάξει σε όλο το κείμενο. Οι κάθετοι / / διαχωρίζουν αυτό που ψάχνουμε (αρχικό) και αυτό με το οποίο θέλουμε να το αντικαστήσουμε (τελικό).

Το 'αρχικό' και το 'τελικό' δεν χρειάζεται να είναι λέξεις ή χαρακτήρες. Μπορεί να είναι και ειδικοί χαρακτήρες.

Για παράδειγμα, με την παρακάτω εντολή βρήκα όλα τα \n σε ένα html αρχείο και τα αντικατέστησα με πραγματική αλλαγή γραμμής:

%s/\\n/\r/g

Δηλαδή το παρακάτω κείμενο:

μπλαμπλα\nμπλιμπλι

μετατράπηκε σε

μπλαμπλα

μπλιμπλι
Φόρουμ
Δώσε αστέρια!

MO: 5 (ψήφοι: 1)

Σχόλια

Πολύ καλή παράθεση Δημήτρη, yes και απλά θέλω να προσθέσω τα εξής:

* Ο οριοθέτης της εντολής μπορεί εκτός από το ( / ) να είναι:

! " # $ % ^ & * ( ) { } [ ] _ - + =@ ~ , . < > ?

έτσι ώστε ανάλογα με το κείμενο που θέλουμε να αντικαταστήσουμε να έχουμε ευκρίνεια η οποία χάνεται με τα πολλά escapes ( \ )

π.χ.

:%s@/pathAlpha/fileAlpha@/pathBravo/fileBravo@g

είναι ευκρινέστερο του:

:%s/\/pathAlpha\/fileAlpha/\/pathBravo\/fileBravo/g

* Όταν θέλουμε να αντικαταστήσουμε μόνο σε ορισμένες γραμμές, μπορούμε να γράψουμε την εντολή ως εξής:

:45s/αρχικό/τελικό/g (Η αντικατάσταση γίνεται μόνο στη γραμμή 45 του κειμένου)

:23,45s/αρχικό/τελικό/g (Η αντικατάσταση γίνεται σε όλες τις γραμμές μεταξύ των γραμμών 23 και 45)

:15,.s/αρχικό/τελικό/g (Η αντικατάσταση γίνεται από την γραμμή 15 μέχρι τη γραμμή που είναι ο cursor)

:57,$s/αρχικό/τελικό/g (Η αντικατάσταση γίνεται από τη γραμμή 57 μέχρι και την τελευταία γραμμή του κειμένου)

:.,$s/αρχικό/τελικό/g (Η αντικατάσταση γίνεται από τη γραμμή που είναι ο cursor μέχρι και την τελευταία γραμμή του κειμένου)

Σημείωση: Οι εντολές :%s/αρχικό/τελικό/g και :1,$s/αρχικό/τελικό/g κάνουν ακριβώς το ίδιο.