Sep
08
2009
Recursive search & replace with sed

Κατά καιρούς (και μέχρι να μάθω από regular expressions) ένα από τα προβλήματα που με έχει ταλαιπωρήσει αρκετά ήταν το εξής:

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

find ΑΡΧΙΚΟΣ_ΚΑΤΑΛΟΓΟΣ -type f -name “ΤΟ ΜΟΤΙΒΟ ΤΩΝ ΑΡΧΕΙΩΝ” -exec sed -r -i ’s/ΑΛΦΑΡΙΘΜΗΤΙΚΟ/ΤΟ_ΝΕΟ_ΑΛΦΑΡΙΘΜΗΤΙΚΟ’ {} \;

και δίνω ένα παράδειγμα για να γίνω πιο κατανοητός:


find /www -type f -name "*.php" -exec sed -r -i 's/ebal/Evaggelos Balaskas/' {} \;

Εάν για παράδειγμα θέλετε να αντικαταστήσετε παραπάνω από ένα αλφαριθμητικό τότε μπορεί κανείς να χρησιμοποιήσει κάτι τέτοιο (έστω ότι θέλω να αλλάξω τις λέξεις ebal ή ebalaskas με το Evaggelos Balaskas):


find /www -type f -name "*.php" -exec sed -r -i 's/(ebal|ebalaskas)/Evaggelos Balaskas/' {} \;

ΥΓ: Την 1η φορά που κατάφερα να κάνω μία υπερβολικά περίπλοκη εργασία σε μερικά δευτερόλεπτα ένιωσα έτσι: i know regular expressions !!!

  1. Avatar di Yiannis Belias Yiannis Belias

    Thursday, September 10, 2009 - 08:20:32

    Θα σου πρότεινα να κολήσεις και ένα g στο τέλος, γιατί χωρίς αυτό η regexp δεν είναι αρκετή για να διαχειριστεί όλες τις πιθανές εκφράσεις του ΕΓΩ σου (σε μια γραμμή). Εννοώ:
    sed -r -i ’s/(ebal|ebalaskas)/Evaggelos Balaskas/g’