Regex: Ersetzen Sie alle Zeichen nach dem 15. mit ‚...‘

stimmen
2

Ich versuche, einige einfache Formatierung Zeug mit ‚sed‘ in Linux zu tun, und ich brauche einen regulären Ausdruck zu verwenden, um einen String nach dem 15. Zeichen zu trimmen, und fügen Sie am Ende ein ‚...‘. Etwas wie das:

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

Kann jemand mir bitte zeigen, wie ich dies als regex schreiben könnte, und erklären, wenn möglich, wie es funktioniert, so dass ich ein wenig besser regex könnte lernen?

Veröffentlicht am 09/12/2008 um 22:35
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
17

Die folgenden Werke für mich:

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

Was hier passiert , ist , dass wir jedes Zeichen (entsprechen .) 15 - mal ( {15}). Wir erfassen den Text so in Klammern abgestimmt. Der folgende Teil ( .+$) paßt die ganzen Rest, bis zum Ende der Zeile. Wir ersetzen diese durch alles , was wir in den Klammern aufgenommen haben ( \1), gefolgt von den hyperbolischen Auslassungszeichen.

Gerecht zu werden sed‚s regex Dialekt (BRE) müssen wir einige der Charaktere entkommen.

Beantwortet am 09/12/2008 um 22:38
quelle vom benutzer

stimmen
6

Erklärung der Konrand Rudolph Antwort, da Sie Erklärungen angefordert (ah, wie ich dies schrieb, Konrad auch seine eigene Erklärung hinzugefügt!)

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

\( 

eine Gruppe starten - die regexp Motor fragen sich daran zu erinnern, was in den Pars ist, und weisen Sie die erste derartige Gruppe 1 auf \, um die zweite 2 usw. \ Wir brauchen nur \ 1 hier

.

Wer passt alles ...

\{15\}

... 15 mal.

\)

am Ende der Gruppe. So \ 1 werden die ersten 15 Zeichen enthalten

 .+

Match wieder etwas. Das + bedeutet „ein oder mehrere Male“, so werden Zeichen über die 15 Zeichen passen wir oben angepasst, ...

 $

... bis zum Ende der Zeile

Jetzt für das ersetzen Bit:

\1

Ersetzen mit dem Inhalt \ 1

...

und drei Punkte.

Erledigt!

Beantwortet am 09/12/2008 um 22:46
quelle vom benutzer

stimmen
1

Mit Perl reguläre Ausdrücke:

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

Der einfachste Weg, über regulären Ausdrücke zu denken, ist ihm ein Muster zu betrachten, die abgestimmt werden muss. In diesem Fall beginnt das Muster mit dem Anfang der Zeile:

^

( Man beachte , dass /ein beliebiger separator. Andere Zeichen stattdessen verwendet werden könnten.) Das ^ist das Symbol, das den Anfang der Zeile in einem regulären Ausdruck darstellt. Als nächstes wird die regex jedes Zeichen:

^.

A .ist die regex Symbol für ein beliebiges Zeichen. Aber wir wollen die ersten 15 Zeichen übereinstimmen:

^.{15}

Es gibt verschiedene Modifikatoren , die eine Wiederholung darstellen. Die häufigste ist *die 0 oder mehr bedeutet. A +zeigt an 1 oder mehr. {15}offensichtlich repräsentiert genau 15. (Die {...}Notationen ist allgemeiner So. *geschrieben werden {0,}und +ist die gleiche wie {1,}.) Nun müssen wir die ersten 15 Zeichen erfassen , damit wir sie später verwenden können:

^(.{15})

Alles zwischen (und )wird in einem speziellen Variable namens erfasst und platziert $1(oder manchmal \1). Der zweite chunk erfasst würde in platziert werden $2und so weiter. Schließlich müssen Sie bis zum Ende der Linie passen , so dass Sie diesen Teil wegwerfen:

^(.{15}).+

Ich anfangs verwendet *, sondern als eine andere Person darauf hingewiesen, dass wahrscheinlich nicht das, was man wollte, als die Zeichenfolge genau 15 Zeichen lang:

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

Mit einem +Mittel des Muster nicht übereinstimmen , wenn es nicht ein 16 - ten Zeichen zu ersetzen.

Die zweite Hälfte der Aussage ist, was gedruckt wird:

$1...

Die $1Variable, die wir früher gefangen wird verwendet , und die Punkte sind wörtlich .s auf dieser Seite der Substitution. Im Allgemeinen alles außer regex Variablen sind wörtliche auf der rechten Seite einer Substitution Aussage.

Beantwortet am 09/12/2008 um 22:39
quelle vom benutzer

stimmen
0

Haben Sie Whack weg wollen wirklich nur alles nach dem 15. Zeichen, oder versuchen Sie , eine 15-stellige maximale Länge zu verhängen? Was passiert , wenn die Zeichenfolge 16 Zeichen lang ist? Alle der bisher vorgestellten Lösungen werden abhacken , dass man nur überschüssiges Zeichen , um es mit zu ersetzen drei Punkten. (Ich weiß , Konrad und Paul auf die Auslassungszeichen verwendet, aber die OP drei Punkte in dem Beispiel verwendet wird ;. Wir eine Entscheidung über das bekommen sollte)

Wenn Sie die Saiten auf eine maximale Länge von 15 trimmen wollen , einschließlich der drei Punkte , können Sie dies tun:

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

Es ist immer noch passt nur, wenn es mehr als 15 Zeichen sind, aber dann hackt es alles nach dem 12. Zeichen aus für die Punkte um Platz zu schaffen.

Beantwortet am 10/12/2008 um 05:06
quelle vom benutzer

stimmen
0

In Perl, könnten Sie schreiben s/(.{15}).*/$1.../. Ich bin nicht sicher , sed die verwenden kann {15} Notation aber wenn nicht, s/\(...............\).*/\1.../(mit 15 Punkten in der Gruppe).

Ich kann nie mehr , ob Sie entkommen müssen , (wenn sie in sed Gruppierung. Ich habe gerade versucht es , und Sie brauchen \(und\)

Beantwortet am 09/12/2008 um 22:42
quelle vom benutzer

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