Questão Excluir todas as linhas no Notepad ++, exceto linhas contendo uma palavra que eu preciso?


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

Como eu posso fazer isso?


174


origem


Relacionado: stackoverflow.com/questions/8264391/… - Cees Timmerman
O plugin LineFilter2 também é fácil de usar. - Karsten


Respostas:


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. Procurar por ^<Path> (^ é para início de linha). Não se esqueça de marcar "Bookmark lines" e pressionar "Mark All".

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

  2. Vá para o menu "Pesquisa - Marcador - Marcador Inverso"

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

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

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


252



+1. Nice, não sabia disso. Há também opções para "Remover linhas não marcadas" ou "Cortar / copiar linhas marcadas" que podem economizar algum tempo. - deizel
Eu tive problemas no início porque minha versão (6.2.3) do Notepad ++ não tem um item de menu chamado "Mark Tab". Em vez disso, você tem que ir em "Search" -> "Find ..." -> clique na aba "Mark". 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! - Adam
Você pode pular a etapa 2, porque é (pelo menos desde a v6.4.5) que você pode escolher "Remover linhas não marcadas". - Nailuj
Eu estou usando o Notepad ++ por tanto tempo e eu nunca soube o que são 'Bookmarks' antes. Incrível como essa ferramenta é poderosa e o pouco que eu sei sobre ela. - Danubian Sailor
Você é um gênio. Este é apenas mais um exemplo chocante de como conhecer a ferramenta que você usa de verdade. - Marcello Grechi Lins


Isso pode realmente ser feito em duas etapas a partir de 6.3. Eu acho que isso pode ser feito antes disso, já que eu tinha 5.9 quando eu tentei pela primeira vez.

Usando o post do stema como base dessa resposta. Há menos um passo agora. Marque as linhas e remova as linhas não marcadas. Feito. Instruções detalhadas a seguir.

  1. Menu de pesquisa "Localizar". Na caixa de diálogo Localizar, clique na guia "Marcar". Ative expressões regulares. Procure por ^ (^ é para início de linha). Não se esqueça de marcar "Bookmark lines" e pressionar "Mark All".

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

  2. Menu de Pesquisa -> Marcador -> Remover Linhas Não Marcadas.

    ==> Todos NÃO As linhas marcadas são excluídas.


56



Isso me levou 10 segundos enquanto a outra solução me levou> 20 segundos. THX! - Black


Limpe a única solução de regex

Variante de dois passos

  1. regex substituir

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

    substitua o teste pelo texto solicitado

  2. substituir

    [\r\n]{2,}
    

    com \r\n

Variante de passo único

Usar ^(?!<Path>).*\r\n para substituir correspondências com uma string 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 look negativo. ^.*test.*$  seleciona toda a linha que contém o texto solicitado.

  2. [\r\n]{2,} corresponde a qualquer \r\n Isso ocorre mais do que uma vez que esta é a nova linha do Windows. Se você tem Linux ou outro sistema operacional, talvez seja necessário mexer com isso. o segundo é substituí-lo por uma linha de retorno.


25



Nota para os povos: Às vezes, regex com fim de linha (EOL) "não funciona". o \r\n EOL mencionado no post é o que o Windows usa e, portanto, pode ou não ser o que você está procurando. Muitas vezes, em ambientes Linux, é apenas \n, ou em ambientes Mac apenas \r, portanto, se você extrair um arquivo de qualquer um deles, não será o estilo EOL do Windows. No entanto, se você fizer o download via gatilhos do modo FileZilla e ASCII, poderá alterá-los de volta para o Windows EOL (gostar \n para dentro \r\n). Portanto, se regex não estiver funcionando, verifique o estilo EOL indo em "Exibir> Mostrar símbolos> Mostrar fim de linha". CR = \r. LF = \n. - dhaupin


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

Isso encontraria todas as linhas contendo seu texto e as listaria na parte inferior. Basta clicar no resultado da pesquisa e copiar / colar.


5



Você precisa remover os números de linha substituindo \tLine [\d]*: . Ainda é uma ótima resposta. - Noumenon


Vá para o menu Pesquisa -> Encontrar... -> Ativar expressões regulares. Pesquisar por "^Caminho"(^ é para início de linha).

Clique no botão "Encontrar todos no documento atual".

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

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

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

Clique no botão "Substituir tudo".


4





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

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

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


3





É desajeitado, mas copie tudo para Excele, em seguida, 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 deslocará as colunas, etc.).


3



Quando existem várias maneiras de lidar com essa tarefa diretamente, por que você deseja copiar de forma destrutiva em outro aplicativo, processar lá e transferir de volta? - Baldrickk


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

Você pode fazer o que quiser de duas maneiras com sed. O utilitário sed é um dos favoritos do * nix e pode ser encontrado para o Windows a partir de pessoas fantásticas do GnuWin (http://gnuwin32.sourceforge.net/packages/sed.htm). Você faria o download desse programa e, em seguida, executaria o comando no prompt de comando.

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

Imprima todas as linhas contendo um novo arquivo:
sed -n '/^<PATH>/p' file > newfile

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

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


2





Use Search-> Replace e insira uma expressão regular como ^[^ ].* e substituir tudo com uma string vazia usando Regular expression. O próximo passo é encontrar linhas vazias procurando \n\n substituindo por \n usando Extended várias vezes até 0 occurrences were found. (usar \r\n\r\n e \r\n dependendo do formato do arquivo). Se você tem muitas linhas vazias seguidas, é mais rápido usar \n\n\n\n\n\n\n ou ainda mais \n: s na string de pesquisa.


0





Melhor solução com regex substituir:

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

E substitua com nada


0



Bem-vindo ao superusuário! Cuidado para explicar isso para aqueles que podem não saber o que cada pedaço da regex faz? :) - bertieb