Come usare sed per testare e poi modificare una riga di input?
Domanda
Voglio verificare se un numero di telefono è valido, quindi tradurlo in un formato diverso usando uno script. Finora posso testare il numero in questo modo:
sed -n -e '/(0..)-...\s..../p' -e '/(0..)-...-..../p'
Tuttavia, non voglio solo testare il numero e produrlo, vorrei rimuovere parentesi, trattini e spazi e produrlo.
Esiste un modo per farlo usando sed? O dovrei usare qualcos'altro, come AWK?
Soluzione
Non sono sicuro del motivo per cui stai utilizzando un 0
in quella posizione. Stai dicendo " uno zero seguito da due caratteri " nella posizione del prefisso. È davvero quello che vuoi dire?
In ogni caso, si desidera utilizzare sed operatore di sostituzione con il comando p
insieme all'opzione -n
. Ecco un modo per farlo:
sed -n 's/(\([0-9][0-9][0-9]\))\s\?\([0-9][0-9][0-9]\)[- ]\([0-9][0-9][0-9][0-9]\)/\1\2\3/p'
Altri suggerimenti
Puoi anche usare qualcosa di semplice come egrep
per convalidare le linee e tr
per rimuovere i caratteri che non vuoi vedere:
egrep "\([0-9]+\)[0-9.-]+" <file> |tr -d '()\-'
Nota che funzionerà solo se non vuoi mantenere nessuno di quei personaggi.
Questa è una versione più succinta della risposta di Jonathan Feinberg . Utilizza espressioni regolari estese per evitare di dover fare tutte le fughe che le parentesi graffe richiederebbero (oltre a spostare la fuga delle parentesi da quelle speciali a quelle letterali).
sed -r 's/\(([[:digit:]]{3})\)\s?([[:digit:]]{3})[ -]([[:digit:]]{4})/\1\2\3/'
questo suggerimento dipende dall'aspetto del formato del tuo numero, ad esempio suppongo che un numero di telefono come questo
echo "(703) 234 5678" | awk '
{
for(i=1;i<=NF;i++){
gsub(/\(|\)/,"",$i) # remove ( and )
if ($i+0>=0 ){ # check if it more than 0 and a number
print $i
}
if (){
# some other checks
}
}
}
'
fallo sistematicamente e non devi perdere tempo a elaborare regex complesse