Filtro di input con sed (regex)


1

Sto riscontrando un problema con sed che non restituisce ciò che mi aspetto quando si utilizza un modello regex per ripulire alcuni output da una query mysql.

mysql -uroot -p -e 'SELECT `path` FROM db.media_gallery' | sed -n -r 's/[^\/]+([^\s]+).*/\1/p'

La query restituisce un gruppo di righe come queste:

| /media/M/W/lmt_MWS04_8.png    |
| /media/M/W/lmt_MWS02_11.png   |

Quando installo questo tramite il comando sed elencato sopra, restituisce questo:

//M/W/lmt_MWS04_8.png
//M/W/lmt_MWS02_11.png

Dove sono finiti i "media"? Perché rimuove in modo casuale una parte della mia stringa?

Qualcuno sa come risolvere il mio regex?


"media" scompare perché è associato alla [^\/]+parte della tua regex, che non è inclusa nell'output. Non possiamo risolvere la tua regex se non sappiamo cosa stavi cercando di fare. Stai cercando di tagliare gli spazi bianchi?
wingedsubmariner,

Risposte:


3

Non c'è bisogno di sed, il vero problema è che stai usando l'output predefinito di mysql destinato al consumo umano piuttosto che automatico. Questo è un compito semplice di cui mysql è più che capace.

mysql -N -s -r -uroot -p -e 'SELECT `path` FROM db.media_gallery'

tornerà:

/media/M/W/lmt_MWS04_8.png
/media/M/W/lmt_MWS02_11.png

da "man mysql":

--skip-column-names, -N
--silent, -s
--raw, -r

0

Il "media" corrisponde a "[^ /] +", quindi è stato sostituito dal materiale tra parentesi. Se lo vuoi, devi aprire le parentesi prima di quella clausola regex.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.