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 seguinte irá variar, e que os detalhes podem não estar na ordem dada ou serem contíguos.
Você pode extrair partes da linha com grep
' -o
flag. Isso imprime apenas a parte correspondente, em vez da linha inteira.
Se você quiser incluir as partes age :
e phone number :
, use o sinalizador -e
para especificar várias correspondências ou alternâncias.
$ 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 a caracteres após age :
até o próximo espaço.
Substitua file
pelo nome do arquivo que contém seus detalhes. Você pode escrever o novo arquivo redirecionando a saída para um novo arquivo com o operador >
, assim:
grep -oe 'age : [^ ]*' -e 'phone number : [^ ]*' file > outfile
Quando você fizer isso, você não verá nenhuma saída. Você deve verificar primeiro a saída e depois redirecionar.
Aqui está o exemplo com alternância. Usamos o sinalizador -E
para informar grep
para usar a regex estendida. A sintaxe é (pattern1|pattern2)
- corresponde a pattern1
e / ou pattern2
. Se um for encontrado, será impresso (independentemente de o outro ser encontrado ou não). Agora estou usando +
significando pelo menos um dos caracteres precedentes, em vez de *
significando zero ou mais do caractere precedente. Nesse contexto, ambos 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 sinalizador -P
para solicitar que grep
use expressões regulares compatíveis com Perl. Isso suporta a alternância e também uma maneira de corresponder ao 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, use sed
, por exemplo:
$ sed -r 's/.*(age) : ([^ ]*).*(phone number) : ([^ ]*).*/: | :/' file
age:23 | phone number:0123
Isso depende de age
vindo antes de phone number
, portanto, ajuste de acordo se não for o caso. Se você não pode confiar no pedido, você pode usar este comando muito intrincado:
$ sed -r 's/(.*)(phone number : [^ ]+)(.*) .*/ /; s/(phone number) : ([^ ]+) .*(age) : ([^ ]+).*/: | : /' file
phone number: 0123 | age: 23
Isso reorganiza a linha para que a seção phone number :
seja a primeira em todas as linhas e, em seguida, faça uma segunda substituição para selecionar os detalhes desejados. Eu devo a técnica usada aqui para responder por muru .
Notas sobre os comandos sed
não cobertos por explicações anteriores
-
-r
usa a regex estendida para comandos mais legíveis (o% GNUsed
entende -E
com o mesmo significado)
-
s/old/new/
replace old
com new
-
(pattern)
salva pattern
para referência posterior, com
ou
etc (correspondente à ordem da esquerda para a direita em que os grupos de captura ocorrem - observe que sed
conterá até 7 desses !).
-
.
de qualquer caractere, portanto .*
representa qualquer número de qualquer caractere.
-
;
separa os comandos, como no shell.