O arquivo de entrada1 é:
dog 123 4335
cat 13123 23424
deer 2131 213132
bear 2313 21313
Atribuo à correspondência o padrão de other file
(como dog 123 4335
no arquivo2).
Eu igualo o padrão da linha dog 123 4335
e, depois de imprimir todas as linhas sem a linha correspondente, minha saída é:
cat 13123 23424
deer 2131 213132
bear 2313 21313
Se usar apenas sem endereço da linha, use apenas o padrão, por exemplo, 1s
como combinar e imprimir as linhas?
text-processing
sed
grep
loganaayahee
fonte
fonte
Respostas:
Supondo que você queira combinar toda a linha com seu padrão, com o GNU
sed
, isso funciona:Equivalente padrão:
Com a seguinte entrada (
infile
):A saída é:
Explicação:
/^dog 123 4335$/
procura o padrão desejado.:a; n; p; ba;
é um loop que busca uma nova linha de input (n
), imprime (p
) e ramifica de volta para rotular a:a; ...; ba;
.Atualizar
Aqui está uma resposta que se aproxima mais de suas necessidades, ou seja, padrão no arquivo2, grepping no arquivo1:
O grep and cut incorporado encontra a primeira linha que contém um padrão do arquivo2, esse número de linha mais um é passado para o final, o mais existe para pular a linha com o padrão.
Se você deseja começar da última partida em vez da primeira, seria:
Observe que nem todas as versões da cauda suportam a notação positiva.
fonte
sed -n '/^dog 123 4335$/ { :a; p; n; ba; }' infile
(com os botões n e alternados) inclui com êxito a linha que corresponde também.Se você tiver apenas um arquivo razoavelmente curto
grep
, pode funcionar:5000 é apenas o meu palpite de "razoavelmente curto", pois
grep
encontra a primeira correspondência e a produz junto com as próximas 5000 linhas (o arquivo não precisa ter tantas). Se você não quiser a correspondência, precisará cortá-la, por exemplo,Se você não quiser a primeira, mas a última correspondência como delimitador, poderá usar isso:
Essa linha lê
animals.txt
na ordem inversa das linhas e gera até e inclusive a linha comdog 123 4335
e, em seguida, reverte novamente para restaurar a ordem correta.Novamente, se você não precisar da correspondência no resultado, acrescente a cauda. (Você também pode complicar a expressão sed para descartar seu buffer antes de sair.)
fonte
Na prática, eu provavelmente usaria a resposta de Aet3miirah na maioria das vezes e a resposta de alexey é maravilhosa quando se deseja navegar pelas linhas (também, também funciona
less
). OTOH, eu realmente gosto de outra abordagem (que é o tipo de resposta de Gilles invertida :Quando chamado com o
-n
sinalizador,sed
não imprime por padrão as linhas que processa mais. Em seguida, usamos um formulário de dois endereços que diz para aplicar um comando da linha correspondente/dog 123 4335/
até o final do arquivo (representado por$
). O comando em questão ép
, que imprime a linha atual. Portanto, isso significa "imprimir todas as linhas da que corresponde/dog 123 4335/
ao final".fonte
dog
linha que não é desejada aqui.sed -n '/dog 123 4335/,$p' | tail -n +2
irá remover a partida tambémSe você precisar ler o padrão de um arquivo, substitua-o no comando sed. Se o arquivo contiver um padrão sed:
Se o arquivo contiver uma cadeia literal para procurar, cite todos os caracteres especiais. Presumo que o arquivo contenha uma única linha.
Se você deseja que a correspondência seja a linha inteira, não apenas uma substring, envolva o padrão
^…$
.fonte
sed
tem0,/dog.../d
para isso.$ more +/"dog 123 4335" file1
fonte
less
.tac
.+
sido substituído pelo-p
POSIX 7: pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html, mas ainda não implementado no util-linux 2.20.1. E isso também imprimeskipping..
e algumas novas linhas extras (para stderr, espero, pode ser bom).Com
awk
:fonte
Uma maneira de usar o awk:
onde file2 contém seus padrões de pesquisa. Primeiro, todo o conteúdo do arquivo2 é armazenado na matriz "a". Quando o arquivo1 é processado, todas as linhas são verificadas na matriz e impressas apenas se não estiverem presentes.
fonte
Se a entrada for um arquivo regular obrigatório :
Com o GNU
grep
:Com
sed
:Um GNU
grep
chamado w / the-m
option encerrará a entrada na partida - e deixará sua entrada (lseekable) fd imediatamente após o ponto em que encontrou sua última correspondência. Assim, chamargrep
w /-m1
encontra a primeira ocorrência de um padrão em um arquivo e deixa o deslocamento de entrada exatamente no lugar certo paracat
escrever tudo após a primeira correspondência do padrão em um arquivo para stdout.Mesmo sem um GNU,
grep
você pode fazer exatamente a mesma coisa com um compatível com POSIXsed
- quandosed
q
usuário é especificado, deixa seu deslocamento de entrada exatamente onde está. O GNUsed
não é compatível com os padrões dessa maneira, portanto, o que foi dito acima provavelmente não funcionará com um GNU, ased
menos que você o chame com seu-u
switch.fonte
sed
compartilhamento de fluxo demonstrado aqui não é especialmente (embora sim, o padrão referenciado faça um exemplo específicosed
como um utilitário assim capaz) do fluxo de trabalho de forma livre e condicionalmente cooperativo mostrado. notavelmente, todos os utilitários padrão foram criados e especificados para cooperar e compartilhar as posições dos cursores dos fluxos de entrada sem falhar no próximo leitor qualquer processamento.grep -q
deve fazer isso; silenciosamentegrep
deve retornar assim que qualquer correspondência na entrada for encontrada, e qualquer restante da entrada não deve, por padrão, ser consumido por padrão.Minha resposta para a pergunta no assunto, sem armazenar padrão em um segundo arquivo. Aqui está o meu arquivo de teste:
GNU sed:
Perl:
Variante Perl com padrão em um arquivo:
fonte
Wth
ed
:Isso envia um
p
comando rint para ed em uma string here; o comando de impressão é limitado no intervalo a um após (+1
) adog 123 4335
correspondência até o final do arquivo ($
).fonte
Se você não se importa com a criação de um arquivo temporário, e tem
csplit
disponível, isso funciona:Nota
file1
é o arquivo de entrada efile2
é o arquivo de padrão (conforme indicado na pergunta).A forma longa do comando acima é:
ou seja,
csplit
sem oprefix
sinalizador acima criaria o arquivoxx00
(sendo o prefixoxx
e o sufixo00
). Com a bandeira acima, ele cria o arquivofile1_00
. Sem oquiet
sinalizador, ele imprime o tamanho do arquivo de saída (tamanho do arquivo resultante).fonte
Como o awk não é expressamente proibido, eis a minha oferta assumindo que 'gato' é a combinação.
fonte
Outra maneira de colocar isso é "como excluir todas as linhas da 1ª até a partida (incluindo)", e isso pode ser
sed
escrito como:fonte
sed -e '0,/MATCH PATTERN/d'
então?