O arquivo que você mostrou tem todos os detalhes em uma linha:
name : farah age : 23 phone number : 0123 education : degree
Eu assumi que você pode codificar age :
etc no comando, mas o texto a seguir varia, e os detalhes podem não estar na ordem especificada ou serem contíguos.
Você pode extrair partes da linha com grep
o -o
sinalizador de. Isso imprime apenas a parte correspondente, em vez da linha inteira.
Se você deseja incluir as peças age :
e phone number :
, pode usar o -e
sinalizador para especificar várias correspondências ou alternância.
$ grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file
age : 23
phone number : 0123
A expressão [^ ]*
significa qualquer número de caracteres que não são um espaço, portanto, corresponde aos caracteres após age :
o próximo espaço.
Substitua file
pelo nome do arquivo que contém seus detalhes. Você pode gravar o novo arquivo redirecionando a saída para um novo arquivo com o >
operador, assim:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
Ao fazer isso, você não verá nenhuma saída. Você deve verificar a saída primeiro e depois adicionar o redirecionamento.
Aqui está o exemplo com alternância. Usamos a -E
flag para dizer grep
para usar regex estendido. A sintaxe é (pattern1|pattern2)
- isso corresponde pattern1
e / ou pattern2
. Se um for encontrado, ele será impresso (independentemente de o outro ser encontrado ou não). Agora estou usando o +
significado de pelo menos um dos caracteres anteriores, em vez de *
significar zero ou mais do caractere anterior. Nesse contexto, os dois funcionam igualmente bem.
$ grep -Eo '(age : [^ ]+|phone number : [^ ]+)' file
age : 23
phone number : 0123
Se você quiser omitir as partes age :
e phone number:
, poderá usar o -P
sinalizador para solicitar o grep
uso de expressões regulares compatíveis com Perl. Isso suporta alternância e também uma maneira de corresponder texto após um determinado padrão:
$ grep -Po '(age : \K[^ ]+|phone number : \K[^ ]+)' file
23
0123
Se você deseja formatar o texto de maneira diferente, pode usar sed
, por exemplo:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/\1:\2 | \3:\4/' file
age:23 | phone number:0123
Isso depende da age
vinda anterior phone number
, portanto, ajuste de acordo se não for esse o caso. Se você não pode confiar no pedido, pode usar este comando muito complicado:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/\2 \1\4/; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/\1: \2 | \3: \4/' file
phone number: 0123 | age: 23
Isso reorganiza a linha para que a phone number :
seção seja a primeira em cada linha e, em seguida, faz uma segunda substituição para selecionar os detalhes desejados. Devo a técnica usada aqui a esta resposta por muru .
Notas sobre sed
comandos não cobertos por explicações anteriores
-r
use regex estendido para comandos mais legíveis (o GNU sed
entende -E
com o mesmo significado)
s/old/new/
substitua old
pornew
(pattern)
salva pattern
para fazer referência mais tarde, com \1
ou \2
etc (correspondente à ordem da esquerda para a direita na qual os grupos de captura ocorrem - observe que sed
conterão apenas 7 deles!).
.
qualquer caractere, portanto, .*
representa qualquer número de caracteres.
;
separa comandos, como no shell.