Προς το περιεχόμενο

Χρήση Sed (?) για αντικατάσταση πολλών διαφορετικών λέξεων


gokal

Προτεινόμενες αναρτήσεις

Καλημέρα,

 

Έχω 60 απλά αρχεία κειμένου που περιέχουν 10-15 κοινές λέξεις. Θέλω αυτές να τις αντικαταστήσω με άλλες μαζικά ώστε να γλιτώσω την επεξεργασία ένα -ένα αρχείο.

 

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

 

Καταλαβαίνω ότι η sed κάνει αυτή τη δουλειά αλλά θέλω μια βοήθεια στο πως θα τη κάνω μαζικά.

 

ευχαριστώ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ξέρω ακριβώς με ποιά λογική θέλεις να κάνεις την αντικατάσταση αλλά ο γενικός κανόνας είναι:

>sed -i 's/boo/bar/g' filename

Το οποίο αντικαθιστά στο αρχείο filename όλες τις λέξεις foo με τη λέξη bar. Η sed δέχεται regular expressions, δηλαδή άν θέεις να αλλάξεις τις λέξεις foo1 και foo2 με την λέξη bar γράφεις:

>sed -i 's/foo1\|foo2/bar/g' filename

ή αν σε ενδιαφέρει να αλλάξεις κάποιες λέξεις μόνο αν αυτές εμφανίζονται στην αρχή της γραμμής γράφεις:

>sed -i 's/^foo/bar/g' filename

πές μας λεπτομέρειες περί του τί είδους αντικατάσταση θέλεις να κάνεις να το συζητήσουμε.

Για πολλά αρχεία φυσικά αντί για filename μπορείς να χρησιμοποιήσεις το shell expansion βάζοντας * για όλα τα αρχεία του directory ή στο bash μπορείς να τα ορίσεις ένα ένα χρησιμοποιόντας {} κάπως έτσι:

>sed -i 's/foo/bar/g' {file1,file2,file3}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστώ για τη βοήθεια είμαστε σε πολύ καλό δρόμο ...

 

Αυτό που θέλω πιο αναλυτικά είναι:

>sed -i 's/foo1\|foo2/bar/g' {file1,file2,file3}

αλλά δεν θέλω τα foo1, foo2 κοκ να γίνουν όλα bar αλλά bar1, bar2 κοκ

 

οπότε ισχύει κάτι τέτοιο?

>
sed -i 's/foo1\|foo2/bar1\|bar2/g' {file1,file2,file3} 

Επίσης μία ακόμα ερώτηση ... εάν ένα από τα αρχεία δεν έχει μία λέξη π.χ τη foo5 η διαδικασία θα σταματήσει ή απλά θα το αγνοήσει? (Είναι βασικό να συνεχίσει)

(δεν είμαι ακόμα στον υπολογιστή που θα κάνω τη διαδικασία γι'αυτό δεν μπορώ ακόμα να κάνω δοκιμές)

 

Εναλλακτικά θα μπορούσε η sed να δεχτεί τις λέξεις προς και αντικατάστασης από 2 αρχεία κειμένου?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλύτερα να μας δώσεις τις πραγματικές λέξεις για να καταλάβουμε τι εννοείς. Έχει σημασία αν οι λέξεις που θέλεις να αντικαταστήσεις έχουν κάποια σχέση μεταξύ τους και αλλάζει π.χ. ένας αριθμός στο τέλος ή είναι εντελώς άσχετες.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αυτό που θέλω πιο αναλυτικά είναι:

>sed -i 's/foo1\|foo2/bar/g' {file1,file2,file3}

αλλά δεν θέλω τα foo1, foo2 κοκ να γίνουν όλα bar αλλά bar1, bar2 κοκ

 

Αν το efficiency δεν είναι παράγοντας, για ευκολία μπορείς πάντα να "σπρώξεις" πράγματα έξω από τη sed, στο shell.

 

Π.χ.

>for x in 1 2; do sed -i 's/foo$x/bar$x/g' {file1,file2,file3}; done

 

Εναλλακτικά θα μπορούσε η sed να δεχτεί τις λέξεις προς και αντικατάστασης από 2 αρχεία κειμένου?

Και αυτό θα μπορούσες να το σπρώξεις στο shell (πιθανότατα θα χρειαστεί να χρησιμοποιήσεις arrays).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επανέρχομαι αφού έκανα κάποιες δοκιμές …

 

Τη δουλειά μου μπορώ να τη κάνω με

> sed -i 's/foo/bar/g' {file1,file2,file3}

απλά ψάχνω για κάτι εναλλακτικό έτσι ώστε να μάθω και κάτι έξτρα και να μου μείνει αφού σίγουρα θα χρειαστεί ξανά στο μέλλον.

 

Έχω αναλυτικά τα εξής:

57αρχεία text που έχουν διαφορετικά filename.

 

Το κάθε αρχείο μεταξύ άλλων έχει λέξεις που δεν έχουν σχέση μεταξύ τους όπως για παράδειγμα:

Patient, Test, Date, Location, Age, Height, Weight κι άλλες

 

εγώ αυτό που θέλω να πετύχω είναι μαζική μετάφραση των παραπάνω και στα 57 αρχεία ταυτόχρονα. Βέβαια δεν έχουν και τα 57 όλες τις λέξεις αλλά τις περισσότερες.

 

Άρα για παράδειγμα πρέπει να τσεκαριστούν όλα τα αρχεία κι όπου εμφανίζεται η λέξη Age, αν εμφανίζεται, να γίνεται Ηλικία.

 

Οι λέξεις προς μετάφραση/αντικατάσταση είναι στο σύνολο 25-30.

Οπότε είτε θα δώσω την παραπάνω εντολή 25-30 φορές ή με τη βοήθειά σας βρίσκω κάτι καλύτερο.

Εάν πάρουμε ως δεδομένο ότι τις 25-30 αυτές λέξεις μαζί με τις αντίστοιχες αντικατάστασης κάπου θα τις εισάγω τότε ίδιος κόπος είναι, απλά ωραία θα ήταν και μία εναλλακτική λύση όπως έγραψα και παραπάνω.

 

Ευχαριστώ

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

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

  • Δημιουργία νέου...