gokal Δημοσ. 5 Νοεμβρίου 2009 Share Δημοσ. 5 Νοεμβρίου 2009 Καλημέρα, Έχω 60 απλά αρχεία κειμένου που περιέχουν 10-15 κοινές λέξεις. Θέλω αυτές να τις αντικαταστήσω με άλλες μαζικά ώστε να γλιτώσω την επεξεργασία ένα -ένα αρχείο. Να πω ότι μπορεί να μην έχουν όλα τα αρχεία όλες τις κοινές λέξεις όποτε θέλω να ελεγχθεί κάθε αρχείο για αυτές τις λέξεις και όσες βρεθούν να αντικατασταθούν με κάποιες άλλες. Καταλαβαίνω ότι η sed κάνει αυτή τη δουλειά αλλά θέλω μια βοήθεια στο πως θα τη κάνω μαζικά. ευχαριστώ Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
NullScan Δημοσ. 5 Νοεμβρίου 2009 Share Δημοσ. 5 Νοεμβρίου 2009 Δεν ξέρω ακριβώς με ποιά λογική θέλεις να κάνεις την αντικατάσταση αλλά ο γενικός κανόνας είναι: >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} Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
gokal Δημοσ. 5 Νοεμβρίου 2009 Μέλος Share Δημοσ. 5 Νοεμβρίου 2009 Ευχαριστώ για τη βοήθεια είμαστε σε πολύ καλό δρόμο ... Αυτό που θέλω πιο αναλυτικά είναι: >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 αρχεία κειμένου? Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
NullScan Δημοσ. 5 Νοεμβρίου 2009 Share Δημοσ. 5 Νοεμβρίου 2009 Καλύτερα να μας δώσεις τις πραγματικές λέξεις για να καταλάβουμε τι εννοείς. Έχει σημασία αν οι λέξεις που θέλεις να αντικαταστήσεις έχουν κάποια σχέση μεταξύ τους και αλλάζει π.χ. ένας αριθμός στο τέλος ή είναι εντελώς άσχετες. Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
nske Δημοσ. 5 Νοεμβρίου 2009 Share Δημοσ. 5 Νοεμβρίου 2009 Αυτό που θέλω πιο αναλυτικά είναι: >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). Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
gokal Δημοσ. 10 Νοεμβρίου 2009 Μέλος Share Δημοσ. 10 Νοεμβρίου 2009 Επανέρχομαι αφού έκανα κάποιες δοκιμές … Τη δουλειά μου μπορώ να τη κάνω με > 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 αυτές λέξεις μαζί με τις αντίστοιχες αντικατάστασης κάπου θα τις εισάγω τότε ίδιος κόπος είναι, απλά ωραία θα ήταν και μία εναλλακτική λύση όπως έγραψα και παραπάνω. Ευχαριστώ Συνδέστε για να σχολιάσετε Κοινοποίηση σε άλλες σελίδες άλλες επιλογές
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.