Eu tenho um arquivo que contém meus dados pessoais (.txt). Como posso, através do terminal, copiar apenas alguns detalhes do arquivo e colocá-los em um novo .txt
arquivo?
Por exemplo, se este for o conteúdo do arquivo:
name : farah age : 23 phone number : 0123 education : degree
como posso copiar apenas idade e número de telefone e enviá-los para um novo .txt
arquivo?
command-line
text-processing
MsWanie
fonte
fonte
Respostas:
Existem várias maneiras de fazer isso. Se o seu arquivo tiver alguma estrutura conhecida, você poderá usá-lo
grep
. Ogrep
comando procura em um arquivo por uma frase específica e retorna linhas que correspondem a essa frase. Portanto, se seu arquivo parecervocê pode correr
grep Name info.txt
e ele retornaráName: Sally
. Você pode redirecionar a saída para outro arquivo. Então chamandogrep Name info.txt > info2.txt
produzirá a linha para o novo arquivo info2.txt. Se você deseja acrescentar novas linhas, pode fazer
grep Address info.txt >> info2.txt
caso contrário, o arquivo será substituído.
Você também pode aprender a usar um editor de texto de linha de comando como o vim.
fonte
Você pode usar o grep para procurar uma expressão regular em details.txt e redirecionar o resultado para o novo arquivo.
Se todas as linhas que você deseja copiar têm algo em comum, as outras linhas não podem ser usadas:
Caso contrário, você terá que procurar cada linha que deseja copiar, ainda usando grep, e anexá-las ao new.txt usando
>>
no lugar de>
.fonte
Existem também editores que trabalham no terminal, por exemplo, nano, vi e emacs.
Se você estiver usando uma interface gráfica do usuário em sua máquina local e um terminal em uma máquina remota, também poderá usar o mouse para copiar e colar de uma janela / guia do terminal para uma segunda.
fonte
Supondo que o arquivo de entrada
details.txt
contenha:você pode selecionar as linhas "nome" e "telefone" por grep estendido e redirecionar a saída para new.txt:
Isso produzirá new.txt com:
Como funciona:
Grep imprime apenas linhas correspondentes. As
-E
opções ativaram o regexp estendido, que oferece a possibilidade de usar|
(alternativa). Lembre-se de citar o padrão inteiro, por isso|
será interpretado pelo grep. Caso contrário, o shell tentará interpretar. Você não quer isso aqui.fonte
O arquivo que você mostrou tem todos os detalhes em uma linha:
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 :
ephone number :
, pode usar o-e
sinalizador para especificar várias correspondências ou alternância.A expressão
[^ ]*
significa qualquer número de caracteres que não são um espaço, portanto, corresponde aos caracteres apósage :
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: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 dizergrep
para usar regex estendido. A sintaxe é(pattern1|pattern2)
- isso correspondepattern1
e / oupattern2
. 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.Se você quiser omitir as partes
age :
ephone number:
, poderá usar o-P
sinalizador para solicitar ogrep
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:Se você deseja formatar o texto de maneira diferente, pode usar
sed
, por exemplo:Isso depende da
age
vinda anteriorphone 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: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 GNUsed
entende-E
com o mesmo significado)s/old/new/
substituaold
pornew
(pattern)
salvapattern
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 quesed
conterão apenas 7 deles!)..
qualquer caractere, portanto,.*
representa qualquer número de caracteres.;
separa comandos, como no shell.fonte