Удалить все строки в Notepad ++, кроме строк, содержащих слово, которое мне нужно?


201

У меня есть текстовый файл, и я хочу, чтобы строки начинались с <Path>, и удалял все остальные строки.

Как я могу это сделать?



1
Плагин LineFilter2 также прост в использовании.
Карстен

Ответы:


292

Существует простой способ добиться этого. Вам нужно выполнить 3 шага.

  1. Зайдите в меню «Поиск»> «Найти ...»> выберите вкладку «Отметить». Активируйте регулярные выражения. Поиск ^<Path>( ^для начала строки). Не забудьте проверить «Закладки линий» и нажать «Отметить все»

    ==> Все строки, которые вы хотите сохранить, имеют закладки

  2. Зайдите в меню «Поиск - Закладка - Обратная закладка»

    ==> Все строки, которые вы хотите удалить, добавлены в закладки.

  3. Зайдите в меню «Поиск - Закладка - Удалить отмеченные строки»

    ==> Все отмеченные строки будут удалены.


47
+1. Хорошо, не знал об этом. Есть также варианты «Удалить непомеченные линии» или «Вырезать / копировать отмеченные линии», которые могут сэкономить некоторое время.
Деизель

6
Сначала у меня были проблемы, потому что моя версия (6.2.3) Notepad ++ не имеет пункта меню с именем «Mark Tab». Вместо этого вам нужно перейти в «Поиск» -> «Найти ...» -> нажать на вкладку «Отметить». И вам больше не нужно инвертировать закладки. Notepad ++ теперь имеет «Удалить неотмеченные строки». Но твой совет мне очень помог! Спасибо!
aakoch

22
Вы можете пропустить шаг 2, потому что можно (по крайней мере, начиная с v6.4.5) выбрать «Удалить непомеченные линии».
Джулиан,

4
Я так долго пользуюсь Notepad ++ и никогда раньше не знал, что такое «Закладки». Удивительно, насколько мощный этот инструмент и как мало я знаю о нем.
Дунайский моряк

Вы гениальный. это еще один шокирующий пример того, как узнать инструмент, который вы используете на самом деле.
Марчелло Гречи Линс

67

На самом деле это можно сделать в два этапа, начиная с 6.3. Я думаю, что это может быть сделано раньше, чем у меня было 5,9, когда я впервые попробовал.

Использование сообщения Stema в качестве основы для этого ответа. Теперь на шаг меньше. Отметьте линии и удалите неотмеченные линии. Готово. Подробные инструкции следуют.

  1. Поиск меню «Найти». В диалоговом окне «Найти» перейдите на вкладку «Отметить». Активируйте регулярные выражения. Поиск ^<Path>( ^для начала строки). Не забудьте проверить «Закладки линий» и нажать «Отметить все»

    ==> Все строки, которые вы хотите сохранить, теперь имеют закладку

  2. Меню поиска -> Закладка -> Удалить неотмеченные строки.

    ==> Все не отмеченные закладкой строки будут удалены.


3
Это заняло у меня 10 секунд, в то время как другое решение заняло у меня> 20 секунд. Спасибо!
Чёрный

Мне не нужно было добавлять ^в мой поисковый запрос или использовать регулярные выражения. Надеюсь, это кому-нибудь поможет.
sa_leinad

29

Чистое регулярное выражение только решение

Двухступенчатый вариант

  1. регулярное выражение заменить

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

    замените тест запрошенным текстом

  2. замещать

    [\r\n]{2,}
    

    с участием \r\n

Одношаговый вариант

Используйте ^(?!<Path>).*\r\nдля замены совпадений пустой строкой. Обобщенная версия будет ^(?!.*?test).*\r\n. Это не удалит пустую строку в конце файла. Все остальные строки удаляются, включая несколько последовательных пустых строк.

Объяснение:

  1. (?!)это отрицательный взгляд вверх. ^.*test.*$ выделяет всю строку, содержащую запрашиваемый текст.

  2. [\r\n]{2,}соответствует любому \r\n, встречающемуся более чем один раз, когда это строка Windows New. если у вас Linux или другая операционная система, вам может понадобиться возиться с этим. во-вторых, заменить его одной обратной строкой.


1
Примечание для людей: иногда регулярное выражение с концом строки (EOL) «не работает». \r\nEOL упоминается в посте , что использует Windows , и , следовательно , может или не может быть то , что вы ищете. Часто в средах Linux это просто \nили в средах Mac просто \r, так что если вы извлекаете файл из одного из них, это не будет EOL в стиле Windows. Однако, если вы загружаете через FileZilla и триггеры режима ASCII, он может изменить их обратно на Windows EOL (как \nв \r\n). Поэтому, если регулярное выражение не работает, проверьте стиль EOL, выбрав «Вид> Показать символы> Показать конец строки». CR = \r. LF = \n.
Дхаупин

5

Мне кажется, что самый простой способ - просто использовать функцию «Найти все в текущем документе», а затем либо скопировать результаты в новый файл, либо выбрать все и заменить в текущем.

Это позволит найти все строки, содержащие ваш текст, и перечислить их внизу. Просто щелкните правой кнопкой мыши на результат поиска и скопируйте / вставьте.


Вы должны удалить номера строк, заменив \tLine [\d]*: . Все еще отличный ответ.
Ноумен

Это не будет работать для строк, которые настолько широки, что Notepad ++ усекает его в окне результатов поиска.
MasterJoe2

4

Зайдите в меню Поиск -> Найти ... -> Активируйте регулярные выражения. Поиск «^ Путь » (^ для начала строки).

Нажмите на кнопку «Найти все в текущем документе».

Появится окно «Найти результат» со всеми линиями шаблона. Выберите скопировать / вставить их на новую вкладку в Notepad ++.

В этой новой вкладке попали: меню Поиск -> Заменить - -> Активировать регулярные выражения.

В поле «Найти что:» используйте шаблон: «Линия \ d +:». Оставьте поле «Заменить на» пустым.

Нажмите на кнопку «Заменить все».


3

Если вы действительно хотите сопоставить, <Path>а не путь к файловой системе, вы можете попробовать это из командной строки, используя Perl:

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

Он работал со Strawberry Perl в Windows, поэтому настройте его соответствующим образом, если результаты не соответствуют ожидаемым.


3

Это неуклюже, но скопируйте все это в Excel , а затем используйте =IF(LEFT(A1,6)="<Path>",A1,"")и скопируйте эту формулу до конца. Затем скопируйте это обратно в Notepad ++. Это не идеально, но довольно просто (если у вас есть Excel). Предупреждение: он не будет хорошо работать с отступами (Excel сместит столбцы и т. Д.).


Если есть несколько способов выполнить эту задачу напрямую, зачем вам деструктивно копировать в другое приложение, обрабатывать его и возвращать обратно?
Baldrickk

1

Нет простого способа сделать то, что вы хотите с помощью Notepad ++. Вам нужно будет либо загрузить программу на свой компьютер, либо написать скрипт на VB (я полагаю, вы работаете в Windows).

Вы можете делать то, что хотите, одним из двух способов с помощью sed. Утилита sed является любимой в * nix и может быть найдена для Windows от великих людей из GnuWin ( http://gnuwin32.sourceforge.net/packages/sed.htm ). Вы должны загрузить эту программу, а затем запустить команду из командной строки.

Удалить все строки, не содержащие:
sed -i '/^<PATH>/!d' file

Вывести все строки, содержащие в новый файл:
sed -n '/^<PATH>/p' file > newfile

Я предлагаю вам использовать печать строк, которые вы хотите в новый файл. Причина этого в том, что вы, вероятно, не получите выражение regex в первый раз. Утилита sed использует базовый синтаксис регулярных выражений (см. Ссылку на http://www.regular-expressions.info/reference.html ). Если это что-то вроде пути * nix (/ var / www), то вам нужно экранировать символ /, чтобы ваше регулярное выражение работало.

Пример: sed -n '/^\/var\/www/p' file > newfile
это распечатает все строки, которые начинаются с '/ var / www'. Если бы я подал запрос на экранирование символа /, команда выдаст ошибку. Вы можете экранировать специальный символ (такой как /) с помощью символа обратной косой черты \.


Это может быть старый ответ, но так как на самом деле он невероятно имеет 2 голоса (-1 теперь от меня), он хотел прокомментировать не только то, насколько он ошибочен, но и повторить в единственной командной операции, как я просто (снова) взял строку> 100k файл журнала до 34 строк, содержащих одно слово (или фразу), в этом случае просто «ошибка» менее чем за 3 секунды, просто поместив это регулярное выражение в НАЙТИ ЧТО: ^ (?!. *? error). * \ r \ n и оставив поле REPLACE WITH пустым, НЕ выбирайте «. соответствия новой строки» и нажмите «ЗАМЕНИТЬ ВСЕ». Да, я тоже люблю sed и awk, но говорить, что АЭС не может этого сделать, - просто ложь.
Коллин Чаффин

1

Лучшее решение с регулярным выражением заменить:

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

И заменить ничем


1
Добро пожаловать в Супер пользователя! Хотите объяснить это тем, кто может не знать, что делает каждый бит регулярного выражения? :)
bertieb

0

Используйте Search-> Replace и введите регулярное выражение как ^[^ ].*и замените все на пустую строку, используя Regular expression. Следующий шаг - найти пустые строки в поисках \n\nзамены с \nиспользованием Extendedнесколько раз до 0 occurrences were found.(используйте \r\n\r\nи в \r\nзависимости от формата файла). Если у вас очень много пустых строк в строке, это быстрее использовать \n\n\n\n\n\n\nили даже больше \n: s в строке поиска.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.