αναζήτηση pattern σε αρχεία και αντικατάστασή του με άλλο

Giorgos Keramidas keramida at ceid.upatras.gr
Wed Oct 11 19:46:31 EEST 2006


On 2006-10-11 15:59, Thanos <pampo at freemail.gr> wrote:
> Έχω ένα φάκελο με αρκετούς υποφακέλους και αρκετά αρχεία απλού κειμένου ο
> καθένας. Προσπαθώ να ψάξω μέσα σε όλα αυτά τα αρχεία για ένα συγκεκριμένο
> pattern και αν υπάρχει να το αντικαταστήσω με κάποιο άλλο που θα δώσω
> εγώ.
> 
> Χωρίς να έχω διαβάσει πολλά και με έλλειψη χρόνου για πειραματισμούς θα
> ήμουν ευγνώμων αν κάποιος με καθοδηγούσε στην σωστή κατεύθυνση.

Μπορείς να βρεις τη λίστα των αρχείων που κάνουν match με το GNU grep:

%   $ cd projects/foo
%   $ grep -irl 'regexp-or-pattern' .

Το να αντικαταστήσεις 'in place' ύστερα ένα pattern (πιθανόν το ίδιο που
έκανε match πριν), μπορεί να γίνει είτε με sed(1), είτε με Perl.  Για
παράδειγμα, σήμερα χρειάστηκε να διορθώσω ένα τυπογραφικό λάθος σε ένα
documentation string στο GNU Emacs source tree.  Αντί να κάθομαι να το
κάνω με το χέρι σε κάθε αρχείο που το είχε, έκανα το εξής:

%   $ cd ~/hg/emacs-keramida
%   $ fgrep -ril quoute .
%   ./lisp/apropos.el
%   $

Αυτό δείχνει τη λίστα με τα αρχεία (που τυχαίνει να είναι ένα αλλά θα
μπορούσε να έχει αρκετές χιλιάδες αρχεία).

Η αντικατάσταση, ύστερα, ήταν θέμα λίγων δευτερολέπτων με:

%   $ fgrep -ril quoute . | xargs perl -i -pe 's/quoute/quote/g'
%   $

Και το αποτέλεσμα φαίνεται στο diff output:

%   $ hg diff
%   diff -r 31f8d3394c63 lisp/apropos.el
%   --- a/lisp/apropos.el   Wed Oct 11 01:49:04 2006 +0300
%   +++ b/lisp/apropos.el   Wed Oct 11 19:41:22 2006 +0300
%   @@ -142,7 +142,7 @@ If value is `verbose', the computed scor
%      "Apropos pattern as entered by user.")
%   
%    (defvar apropos-pattern-quoted nil
%   -  "Apropos pattern passed through `regexp-quoute'.")
%   +  "Apropos pattern passed through `regexp-quote'.")
%   
%    (defvar apropos-words ()
%      "Current list of apropos words extracted from `apropos-pattern'.")
%   $

Το μόνο σημείο που ίσως χρειαστεί να προσέξεις λίγο είναι αν τα filenames
περιέχουν spaces, γιατί τότε η xargs θα περάσει λάθος arguments στην Perl.
Υπάρχουν τρόποι να το αποφύγεις κι αυτό, αλλά μη σε μπλέξω ΠΟΛΥ απόψε :-)




More information about the Migrate2linux mailing list