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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top