Non è necessario combinarli egrep
e sed
poiché entrambi i comandi cercheranno le corrispondenze all'interno dei file e restituiranno i risultati ( egrep
) o agiranno su di essi ( sed
), quindi lo sed
farà da solo. Ma per capire perché la tua linea non ha funzionato, andrò con il tuo esempio:
L' egrep
output regolare ha il modulo filename:matching_line
quando viene eseguito su più file e matching_line
quando viene eseguito su un singolo file, mentre sed
prevede solo nomi di file. Per sopprimere l' egrep
output normale e stampare solo i nomi dei file che includono corrispondenze, utilizzare l' -l
opzione.
Inoltre, non vuoi uno spazio nella tua lista dei personaggi ( [...]
), altrimenti sarà troppo avido e corrisponderà a più di una sola parola. Una linea che funzionerebbe è:
$ egrep -l '[b-su-z]+_[0-9]+$' sst_piso_top_c0.spf_typ_C | xargs sed -ri 's/[b-su-z]+_([0-9])+$/\\<\1>/g'
Se un comando composto non funziona, è generalmente una buona idea eseguire da soli i pezzi separati e verificarne i risultati. Inoltre, i messaggi di errore come "Nessun file di questo tipo" indicano di solito la giusta direzione (e sarebbe una buona idea includerli nel rapporto qui).
Infine, come detto sopra, combinando egrep
e sed
non ha senso. Una linea ragionevole sarebbe
$ sed -ri 's/[b-su-z]+_([0-9])+$/\\<\1>/g' sst_piso_top_c0.spf_typ_C
Aggiornamento: c'era un refuso nel mio regex, che ho corretto. Ho anche incluso il riferimento ai numeri nella partita originariamente incluso da zuazo. Sembra più chiaro dai commenti che hai scritto ora che non vuoi sostituire la corrispondenza completa con un'espressione statica \<23>
come l'ho capito per la prima volta, ma vuoi che il numero corrispondente sia visualizzato tra parentesi angolari ...