Regex: αντικαταστήσει όλους τους χαρακτήρες μετά το 15ο με «...»

ψήφοι
2

Προσπαθώ να κάνω κάποια απλή μορφοποίηση πράγματα με «sed» στο linux, και εγώ πρέπει να χρησιμοποιήσετε ένα regex για να τακτοποιήσει μια σειρά μετά την 15η χαρακτήρα, και επισυνάπτει ένα «...» στο τέλος. Κάτι σαν αυτό:

before: this is a long string that needs to be shortened
after: this is a long ...

Μπορεί κάποιος παρακαλώ να μου δείξει πώς θα μπορούσα να γράψω αυτό ως ένα regex, και αν είναι δυνατόν να εξηγήσει πώς λειτουργεί, έτσι ώστε θα μπορούσα να μάθουν REGEX λίγο καλύτερα;

Δημοσιεύθηκε 09/12/2008 στις 22:35
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
17

Οι παρακάτω εργασίες για μένα:

echo "This is a test with more than 15 characters" | sed "s/\(.\{15\}\).\+$/\1…/"

Αυτό που συμβαίνει εδώ είναι ότι ταιριάζει με κανένα χαρακτήρα ( .) 15 φορές ( {15}). Έχουμε συλλάβει το κείμενο έτσι ταιριάζει μέσα σε παρενθέσεις. Το επόμενο μέρος ( .+$) ταιριάζει με όλα τα υπόλοιπα, μέχρι το τέλος της γραμμής. Θα αντικαταστήσει αυτό με ό, τι έχουμε συλληφθεί μέσα στις παρενθέσεις ( \1), ακολουθούμενη από την υπερβολική αποσιωπητικά.

Για να ικανοποιήσει sedregex διάλεκτο «s (BRE) θα πρέπει να ξεφύγουν από μερικούς από τους χαρακτήρες.

Απαντήθηκε 09/12/2008 στις 22:38
πηγή χρήστη

ψήφοι
6

Επεξήγηση απάντηση Konrand Ρούντολφ, από τη στιγμή που ζήτησε εξηγήσεις (αχ, όπως έγραψα αυτό, Konrad πρόσθεσε τη δική του εξήγηση πάρα πολύ!)

 sed "s/\(.\{15\}\).+$/\1…/"

\( 

ξεκινήσει μια ομάδα - να ζητήσει από τον κινητήρα regexp να θυμηθούμε τι είναι παράμετρος μέσα στις παρενθέσεις, και να αναθέσει την πρώτη ομάδα για να \ 1, η δεύτερη σε \ 2 κλπ Θα χρειαστείτε μόνο \ 1 εδώ

.

Ταιριάζουν με τίποτα ...

\{15\}

... 15 φορές.

\)

τερματισμό της ομάδας. Έτσι \ 1 θα περιέχει τα πρώτα 15 χαρακτήρες

 .+

ταιριάζουν και πάλι τίποτα. Το + σημαίνει «μία ή περισσότερες φορές», έτσι ώστε να ταιριάζουν με τους χαρακτήρες πέρα ​​από τους 15 χαρακτήρες που ταιριάζουν παραπάνω, ...

 $

... μέχρι το τέλος της γραμμής

Τώρα για το κομμάτι αντικατάσταση:

\1

Αντικαταστήστε με το περιεχόμενο της \ 1

...

και τρεις τελείες.

Εγινε!

Απαντήθηκε 09/12/2008 στις 22:46
πηγή χρήστη

ψήφοι
1

Με Perl regular expressions:

$ echo 'this is a long string that needs to be shortened' \
| perl -pe 's/^(.{15}).+/$1.../'
this is a long ...

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

^

(Σημειώστε ότι /είναι ένα αυθαίρετο διαχωριστή. Άλλοι χαρακτήρες θα μπορούσαν να χρησιμοποιηθούν αντ 'αυτού.) Το ^είναι το σύμβολο που αντιπροσωπεύει την αρχή της γραμμής σε ένα regex. Στη συνέχεια το regex αγώνες κάθε χαρακτήρα:

^.

Ένα .είναι το σύμβολο regex για κάθε χαρακτήρα. Αλλά θέλουμε να ταιριάζουν με τα πρώτα 15 χαρακτήρες:

^.{15}

Υπάρχουν πολλές διαφορετικές τροποποιητές που αντιπροσωπεύουν μια επανάληψη. Η πιο συνηθισμένη είναι *που σηματοδοτεί 0 ή περισσότερο. Μια +υποδηλώνει 1 ή περισσότερο. {15}προφανώς αντιπροσωπεύει ακριβώς 15. (Οι {...}συμβολισμοί είναι πιο γενική Έτσι. *θα μπορούσε να γραφτεί {0,}και να +είναι το ίδιο {1,}.) Τώρα πρέπει να συλλάβει τους πρώτους 15 χαρακτήρες, έτσι ώστε να μπορούμε να τα χρησιμοποιήσετε αργότερα:

^(.{15})

Τα πάντα μεταξύ (και )συλλαμβάνεται και τοποθετείται σε μια ειδική μεταβλητή που ονομάζεται $1(ή μερικές φορές \1). Το δεύτερο κομμάτι συλλαμβάνονται θα πρέπει να τοποθετούνται σε $2και ούτω καθεξής. Τέλος, θα πρέπει να ταιριάζει με το τέλος της γραμμής, έτσι ώστε να μπορείτε να ρίξει το μέρος μακριά:

^(.{15}).+

Εγώ αρχικά χρησιμοποιηθεί *, αλλά ως ένα άλλο πρόσωπο επεσήμανε, ότι κατά πάσα πιθανότητα δεν είναι ό, τι ήθελε, όταν η σειρά είναι ακριβώς 15 χαρακτήρες:

$ echo 'this is a long ' \
| perl -pe 's/^(.{15}).*/$1.../'
this is a long ...

Χρησιμοποιώντας ένα +μέσο το σχέδιο δεν θα ταιριάζει αν δεν υπάρχει ένα 16 ου χαρακτήρα για να αντικαταστήσει.

Το δεύτερο μισό της δήλωσης είναι αυτό που θα εκτυπωθεί:

$1...

Η $1μεταβλητή που πιάσαμε νωρίτερα χρησιμοποιείται και οι τελείες είναι κυριολεκτική .σχετικά με αυτήν την πλευρά της υποκατάστασης. Σε γενικές γραμμές, τα πάντα εκτός από regex μεταβλητές είναι κυριολεκτική στη δεξιά πλευρά του δήλωση υποκατάστασης.

Απαντήθηκε 09/12/2008 στις 22:39
πηγή χρήστη

ψήφοι
0

Είστε σίγουροι ότι θέλετε απλά να παλαβό από ό, τι μετά την 15η χαρακτήρα, ή προσπαθείτε να επιβάλει ένα μέγιστο μήκος 15 χαρακτήρων; Τι θα συμβεί αν η σειρά είναι 16 χαρακτήρες; Όλες οι λύσεις που παρουσιάζονται μέχρι τώρα θα κόψουν ότι μόνο μία περίσσεια χαρακτήρα για να το αντικαταστήσει με τρεις τελείες. (Ξέρω Konrad και ο Παύλος χρησιμοποίησε τον χαρακτήρα αποσιωπητικά, αλλά η ΕΠ χρησιμοποιούνται τρεις τελείες στο παράδειγμα?. Θα πρέπει να πάρει μια απόφαση σχετικά με αυτό)

Αν θέλετε να κόψετε τις χορδές σε μέγιστο μήκος 15 συμπεριλαμβανομένων των τριών κουκκίδες , μπορείτε να το κάνετε αυτό:

s/^\(.\{12\}\).\{3\}.\+$/\1.../

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

Απαντήθηκε 10/12/2008 στις 05:06
πηγή χρήστη

ψήφοι
0

Στην Perl, θα μπορούσατε να γράψετε s/(.{15}).*/$1.../. Δεν είμαι σίγουρος sed να χρησιμοποιήσετε το {15} σημειογραφία, αλλά αν όχι, s/\(...............\).*/\1.../(με 15 κουκκίδες στην ομάδα).

Δεν μπορώ ποτέ να θυμηθώ αν θα πρέπει να ξεφύγουν (όταν ομαδοποίηση σε sed. Απλά προσπάθησα και χρειάζεται \(και\)

Απαντήθηκε 09/12/2008 στις 22:42
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more