Você deseja remover todos os espaços e traços imediatamente antes de (
? Então você precisa usar uma classe de caractere ou "expressão de colchetes", incluindo espaço e traço: [- ]
sed -e 's/[- ]*(/(/g'
Veja man 7 regex
e procure bracket expression
para mais detalhes.
Com a entrada que você mencionou ( 081 379 62 49 (Hems)
ou 081-379-62-49 (Hems)
), você pode fazer isso com awk
:
awk -F'(' 'BEGIN {OFS=" ("} ; {gsub(/[- ]/,"",$1) ; print}'
isso diz ao awk para usar (
como separador de campo e, em seguida, usa a função gsub()
para remover espaços e traços do primeiro campo (o número de telefone). O Output Field Separator (OFS) é definido como (
(espaço e (
) para produzir a saída correta.
por exemplo,
echo -e "081 379 62 49 (Hems)\n081-379-62-49 (Hems)" |
awk -F'(' 'BEGIN {OFS=" ("} ; {gsub(/[- ]/,"",$1) ; print}'
0813796249 (Hems)
0813796249 (Hems)
BTW, se não houver espaços ou traços após o número de telefone (por exemplo, dentro do (...)
), você também pode fazer isso com o sed:
echo -e "081 379 62 49 (Hems)\n081-379-62-49 (Hems)" |
sed -e 's/[ -]//g ; s/(/ (/'
Isso remove TODOS os espaços e traços da linha de entrada e, em seguida, coloca um espaço de volta imediatamente antes do (
. Isso irá desagradar a saída horrivelmente se houver várias palavras dentro dos parênteses (campo comment / name?)
Provavelmente, existe uma maneira complicada de fazer isso corretamente, copiando o número do telefone para manter o espaço, modificando-o e reinserindo-o novamente na linha de saída, mas é muito mais fácil fazer isso com o awk.