Excluir todas as linhas do Notepad ++, exceto as linhas que contenham uma palavra necessária?

201

Eu tenho um arquivo de texto e quero manter as linhas iniciadas <Path>e excluir todas as outras linhas.

Como eu posso fazer isso?

wonea
fonte
Veja também: stackoverflow.com/questions/8264391/…
Cees Timmerman
1
O plugin LineFilter2 também é fácil de usar.
Karsten

Respostas:

292

Existe uma maneira fácil de conseguir isso. Você precisa executar 3 etapas.

  1. Vá para o menu Pesquisar> Localizar ...> Selecione a guia "Marcar". Ative expressões regulares. Procure ^<Path>( ^é para o início da linha). Não se esqueça de marcar "Linhas do marcador" e pressionar "Marcar tudo"

    ==> Todas as linhas que você deseja manter têm um marcador

  2. Vá para o menu "Pesquisar - Favorito - Favorito inverso"

    ==> Todas as linhas que você deseja excluir estão marcadas.

  3. Vá para o menu "Pesquisar - Favorito - Remover linhas marcadas"

    ==> Todas as linhas marcadas são excluídas.

stema
fonte
47
+1. Bom, não sabia disso. Também existem opções para "Remover linhas não marcadas" ou "Cortar / copiar linhas marcadas" que podem economizar algum tempo.
deizel
6
Eu tive problemas no começo porque minha versão (6.2.3) do Notepad ++ não tem um item de menu chamado "Marcar guia". Em vez disso, você deve ir em "Pesquisar" -> "Localizar ..." -> clique na guia "Marcar". E você não precisa mais inverter os marcadores. O Notepad ++ agora tem "Remover linhas não marcadas". Mas sua dica me ajudou muito! Obrigado!
Aakoch
22
Você pode pular a etapa 2, porque é possível (pelo menos desde a v6.4.5) escolher "Remover linhas não marcadas".
Julian
4
Estou usando o Notepad ++ há tanto tempo e nunca soube o que são 'Favoritos' antes. Incrível como essa ferramenta é poderosa e quão pouco eu sei sobre ela.
Sailor Danubian
Você é um gênio. este é apenas outro exemplo chocante de como conhecer a ferramenta que você usa de verdade.
Marcello Grechi Lins
67

Na verdade, isso pode ser feito em duas etapas a partir da versão 6.3. Eu acho que isso pode ser feito antes disso, como eu tinha 5,9 quando tentei pela primeira vez.

Usando a publicação de stema como base desta resposta. Há um passo a menos agora. Marque linhas e remova linhas não marcadas. Feito. Seguem instruções detalhadas.

  1. Menu de pesquisa "Localizar". Na caixa de diálogo Localizar, clique na guia "Marcar". Ative expressões regulares. Procure ^<Path>( ^é para o início da linha). Não se esqueça de marcar "Linhas do marcador" e pressionar "Marcar tudo"

    ==> Todas as linhas que você deseja manter agora têm um marcador

  2. Menu Pesquisa -> Favorito -> Remover linhas não marcadas.

    ==> Todas as linhas não marcadas como marcadas são excluídas.

Reconhecedor
fonte
3
Isso levou 10 segundos, enquanto a outra solução levou> 20 segundos. Valeu!
Preto
Não precisei adicionar o ^termo no meu termo de pesquisa nem usar expressões regulares. Espero que isso ajude alguém.
sa_leinad
29

Solução limpa apenas para regex

Variante em duas etapas

  1. regex substituir

    (?!^.*test.*$)^.+
    

    substitua teste pelo texto solicitado

  2. substituir

    [\r\n]{2,}
    

    com \r\n

Variante de passo único

Use ^(?!<Path>).*\r\npara substituir correspondências por uma sequência vazia. Versão generalizada seria ^(?!.*?test).*\r\n. Isso não removerá a linha vazia no final do arquivo. Todas as outras linhas são removidas, incluindo várias linhas vazias consecutivas.

Explicação:

  1. (?!)é um olhar negativo. ^.*test.*$ seleciona a linha inteira que contém o texto solicitado.

  2. [\r\n]{2,}corresponde a qualquer um \r\nque ocorra mais que uma vez que esta seja a nova linha do Windows. se você possui Linux ou outro sistema operacional, pode ser necessário mexer com isso. o segundo é substituí-lo por uma linha de retorno.

sonar0m
fonte
1
Nota para os povos: Às vezes, a expressão regular com fim de linha (EOL) "não funciona". A \r\nEOL mencionada na postagem é o que o Windows usa e, portanto, pode ou não ser o que você está procurando. Geralmente, em ambientes Linux, é apenas \n, ou apenas em ambientes Mac \r; portanto, se você extrair um arquivo de qualquer um deles, não será a EOL no estilo Windows. No entanto, se você fizer o download via gatilhos do modo FileZilla e ASCII, ele poderá ser alterado novamente no Windows EOL (como \nem \r\n). Portanto, se o regex não estiver funcionando, verifique o estilo EOL, indo em "Exibir> Mostrar Símbolos> Mostrar Fim da Linha". CR = \r. LF = \n.
dhaupin
5

Parece-me que a maneira mais fácil é usar o recurso "Localizar tudo no documento atual" e copiar os resultados em um novo arquivo ou selecionar todos e substituir o atual.

Isso encontrará todas as linhas que contêm seu texto e as listará na parte inferior. Basta clicar com o botão direito do mouse no resultado da pesquisa e copiar / colar.

Gubbins
fonte
Você precisa remover os números de linha substituindo \tLine [\d]*: . Ainda é uma ótima resposta.
Noumenon
Isso não funcionará para as linhas que são tão amplas que o Notepad ++ o trunca na janela de resultados da pesquisa.
MasterJoe2
4

Vá para o menu Pesquisar -> Localizar ... -> Ativar expressões regulares. Procure por "^ Path " (^ é para o início da linha).

Clique no botão "Localizar tudo no documento atual".

A janela "Resultado da pesquisa" aparecerá com todas as linhas do padrão. Selecione copiar / colá-los em uma nova guia no Notepad ++.

Nesta nova guia, acesse: menu Pesquisar -> Substituir ... -> Ativar expressões regulares.

No campo "Localizar o que:", use o padrão: "Linha \ d +:". Deixe o campo "Substituir por:" em branco.

Clique no botão "Substituir tudo".

Luis
fonte
3

Desde que você realmente deseje corresponder <Path>e não um caminho do sistema de arquivos, você pode tentar isso em uma linha de comando usando o Perl:

perl -pe " if ($_ !~ /<Path>/) { s/$_// } " < in.txt > out.txt

Ele funcionou com o Strawberry Perl no Windows, portanto, ajuste de acordo se os resultados não forem os esperados.

Joe Internet
fonte
3

É desajeitado, mas copie tudo para o Excel e use =IF(LEFT(A1,6)="<Path>",A1,"")e copie essa fórmula até o fim. Em seguida, copie isso de volta para o Notepad ++. Não é o ideal, mas é bem fácil (se você tiver o Excel). Aviso: Não funcionará bem com linhas recuadas (o Excel mudará as colunas etc.).

soandos
fonte
Quando existem várias maneiras de lidar com essa tarefa diretamente, por que você deseja copiar destrutivamente para outro aplicativo, processá-lo e transferi-lo de volta?
Baldrickk
1

Não há uma maneira fácil de fazer o que você quer com o Notepad ++. Você precisará baixar um programa para o seu computador ou criar um script em VB (presumo que você esteja no Windows).

Você pode fazer o que quiser de duas maneiras com o sed. O utilitário sed é o favorito no * nix e pode ser encontrado no Windows entre as grandes pessoas do GnuWin ( http://gnuwin32.sourceforge.net/packages/sed.htm ). Você faria o download deste programa e executaria seu comando no prompt de comando.

Exclua todas as linhas que não contêm:
sed -i '/^<PATH>/!d' file

Imprima todas as linhas que contêm para um novo arquivo:
sed -n '/^<PATH>/p' file > newfile

Eu sugiro que você use imprimir as linhas que deseja para um novo arquivo. A razão para isso é que você provavelmente não receberá a instrução regex pela primeira vez. O utilitário sed usa a sintaxe básica da expressão regular (consulte a referência em http://www.regular-expressions.info/reference.html ). Se for algo como um caminho * nix (/ var / www), você precisará escapar do caractere / para que seu regex funcione.

Exemplo: sed -n '/^\/var\/www/p' file > newfile
Isso imprimirá todas as linhas que começam com '/ var / www'. Se eu arquivasse para escapar do caractere /, o comando geraria um erro. Você pode escapar de um caractere especial (como /) com o caractere de barra invertida \.

Chris Ting
fonte
Esta pode ser uma resposta antiga, mas, como na verdade, inacreditavelmente, tem 2 votos (-1 agora de mim), quis comentar não apenas o quão errado é, mas reiterar em uma operação de comando ÚNICO como eu apenas (novamente) peguei uma linha> 100k arquivo de log até as 34 linhas que contêm a única palavra (ou frase), neste caso, simplesmente "erro" em menos de 3 segundos, simplesmente colocando esse regex no FIND WHAT: ^ (?!. *? error). * \ r \ e deixando SUBSTITUIR COM em branco, e NÃO selecione ". corresponde à nova linha" e clique em "SUBSTITUIR TUDO". Sim, eu também amo sed e awk, mas dizer que a NPP não pode fazer isso é apenas falso.
precisa
1

Melhor solução com regex replace:

(?!^.*SOMETEXT.*$)^.+\r?\n

E substitua por nada

LoneDev
fonte
1
Bem-vindo ao Super Usuário! Gostaria de explicar isso para aqueles que talvez não saibam o que cada parte do regex faz? :)
bertieb
0

Use Pesquisar-> Substituir e insira uma expressão regular como ^[^ ].*e substitua todos por uma sequência vazia usando Regular expression. O próximo passo é encontrar linhas vazias procurando \n\nsubstituir \nusando Extendedvárias vezes até 0 occurrences were found.(usar \r\n\r\ne \r\ndependendo do formato do arquivo). Se você tiver muitas linhas vazias em uma linha, é mais rápido usar \n\n\n\n\n\n\nou ainda mais \n: s na sequência de pesquisa.

AndersTornkvist
fonte