
Eu tenho um arquivo com nomes de países e, em seguida, o prefixo do código do país móvel para esse país, assim:
United Kingdom +44 ...more fields
United States Virgin Islands +1 ...more fields
Preciso obter o nome do país e o prefixo do celular. Portanto, a expressão regular é assim: leia todas as palavras desde o início da linha e depois uma string que começa com um sinal de mais e mais um dígito e depois pare.
Tentei algumas coisas com grep, cut e até sed, mas não consigo.
Responder1
tente com:
grep -o '^[^+]*+[0-9]\+' infile
[^+]*+
corresponde a tudo até +
ser encontrado pela primeira vez, seguido por um ou mais dígitos[0-9]\+
Responder2
Linha de comando:
$ perl -lne 'print /^(.*?\+\d+)/' input.txt
Isso fornecerá as informações desejadas da entrada.
Trabalhando:
/^(.*?\+\d+)/
regex deve extrair tudo até a primeira ocorrência de um símbolo de mais seguido por pelo menos um símbolo de dígito.- Como isso está vinculado ao símbolo
BOL
do^
cursor, obviamente apenas uma correspondência pode acontecer. - A correspondência é passada para a
print
função. -lne
as opções são para executarPerl
o código fornecido na-e
opção em cada linha do input.file.-n
faz com que o perl não imprima nada, a menos que seja especificamente solicitado.
Saída:
United Kingdom +44
United States Virgin Islands +1
Responder3
Desdevocê diz espaçoé o delimitador usado em seu arquivo, você poderá usar
cut -d ' ' -f 1-5 filename
para extrair as cinco primeiras colunas do arquivo.
Para os dados fornecidos, isso produz
United Kingdom +44
United States Virgin Islands +1
... mas presumo que isso seja apenas uma questão de sorte, já que um país com mais de duas palavras em seu nome abrangeria vários campos (não apenas dois).
Um método mais robusto sed
para excluir tudo após o primeiro conjunto de dígitos em cada linha (ou seja, tudo após o código do país):
sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename
ou,
sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename
ou, com -E
uma expressão regular estendida,
sed -E 's/([[:digit:]]+).*/\1/' filename