Regex: sostituire tutti i caratteri dopo il 15 con '...'

voti
2

Sto cercando di fare qualche semplice roba di formattazione con 'sed' in Linux, e ho bisogno di usare una regex per tagliare una stringa dopo il 15 ° carattere, e aggiungere un '...' fino alla fine. Qualcosa come questo:

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

Qualcuno può mostrarmi come avrei potuto scrivere questo come una regex, e, se possibile spiegare come funziona in modo che potrei imparare regex un po 'meglio?

È pubblicato 09/12/2008 alle 22:35
fonte dall'utente
In altre lingue...                            


5 risposte

voti
17

Le seguenti opere per me:

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

Quello che succede qui è che abbiniamo qualsiasi carattere ( .) 15 volte ( {15}). Noi catturare il testo in modo abbinato all'interno parentesi. La parte seguente ( .+$) corrisponde a tutti gli altri, fino alla fine della linea. Sostituiamo questo con qualsiasi abbiamo catturato all'interno delle parentesi ( \1), seguiti da puntini di sospensione iperbolica.

Per soddisfare seddialetto regex 's (BRE) dobbiamo sfuggire alcuni dei personaggi.

Risposto il 09/12/2008 a 22:38
fonte dall'utente

voti
6

Spiegazione della risposta di Konrand Rudolph, dal momento che hai richiesto spiegazioni (ah, come ho scritto questo, Konrad ha aggiunto la sua spiegazione troppo!)

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

\( 

avviare un gruppo - chiedere al motore di regexp di ricordare ciò che è dentro le parentesi, e assegnare il primo di questi gruppi a \ 1, il secondo a \ 2, ecc Ci sarà solo bisogno \ 1 qui

.

Partita nulla ...

\{15\}

... 15 volte.

\)

terminare il gruppo. Così \ 1 conterrà i primi 15 caratteri

 .+

corrispondere nulla di nuovo. Il + significa "una o più volte", in modo corrisponderà caratteri oltre i 15 caratteri Abbiamo abbinato sopra, ...

 $

... fino alla fine della linea

Ora per il bit sostituzione:

\1

Sostituire con il contenuto di \ 1

...

e tre punti.

Fatto!

Risposto il 09/12/2008 a 22:46
fonte dall'utente

voti
1

Con espressioni regolari Perl:

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

Il modo più semplice di pensare espressioni regolari è quello di considerarlo un modello che deve essere abbinato. In questo caso il modello inizia con l'inizio della linea:

^

(Si noti che /è un separatore arbitrario. Altri caratteri potrebbero essere utilizzati al posto.) L' ^è il simbolo che rappresenta l'inizio della linea in una regex. Avanti l'espressione regolare corrisponde a qualsiasi carattere:

^.

Una .è il simbolo regex per qualsiasi carattere. Ma vogliamo abbinare i primi 15 caratteri:

^.{15}

Ci sono diversi modificatori diversi che rappresentano una ripetizione. Il più comune è *che significa 0 o più. A +indica 1 o più. {15}rappresenta, ovviamente, esattamente 15. (Le {...}notazioni è più generale così. *potrebbe essere scritta {0,}ed +è lo stesso {1,}.) Ora abbiamo bisogno di catturare i primi 15 caratteri in modo che possiamo utilizzare in seguito:

^(.{15})

Tutto tra (e )viene catturato e posto in una variabile speciale chiamata $1(oa volte \1). Il secondo pezzo catturato si troverebbe in $2e così via. Infine, è necessario abbinare alla fine della linea in modo che si può buttare via quella parte:

^(.{15}).+

Inizialmente ho usato *, ma come un'altra persona fatto notare, che, probabilmente, non è ciò che si vuole quando la stringa è lunga esattamente 15 caratteri:

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

Utilizzando un +mezzo il modello non corrisponde, se non v'è un 16 ° carattere da sostituire.

La seconda metà della dichiarazione è quello che viene stampato:

$1...

La $1variabile che abbiamo preso in precedenza viene utilizzato ei puntini sono letterali .s su questo lato della sostituzione. In generale, tutto tranne le variabili espressioni regolari sono letteralmente sul lato destro di una dichiarazione sostitutiva.

Risposto il 09/12/2008 a 22:39
fonte dall'utente

voti
0

Vuoi davvero a colpire appena fuori tutto dopo il 15 ° carattere, o stai cercando di imporre un 15 caratteri lunghezza massima? Che cosa succede se la stringa è di 16 caratteri? Tutte le soluzioni presentate finora taglierà fuori che solo un personaggio in eccesso per sostituirlo con tre punti. (Lo so Konrad e Paolo usato il carattere puntini di sospensione, ma l'OP usato tre puntini nel esempio:. Dovremmo ottenere una sentenza su questo)

Se si vuole tagliare le corde per una lunghezza massima di 15 tra cui i tre punti , si può fare questo:

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

E 'ancora corrisponde solo se ci sono più di 15 caratteri, ma poi braciole fuori tutto dopo il carattere 12 ° per fare spazio per i punti.

Risposto il 10/12/2008 a 05:06
fonte dall'utente

voti
0

In Perl, si potrebbe scrivere s/(.{15}).*/$1.../. Non sono sicuro sed può usare il {15} la notazione, ma se non, s/\(...............\).*/\1.../(con 15 punti nel gruppo).

Non riesco mai a ricordare se avete bisogno di fuggire (quando il raggruppamento in sed. Ho appena provato e si ha bisogno \(e\)

Risposto il 09/12/2008 a 22:42
fonte dall'utente

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