it-swarm.com.ru

Удалить определенные строки в текстовом файле через командный файл

У меня есть сгенерированный текстовый файл. В этом файле есть определенные строки, которые являются лишними и должны быть удалены. Каждая строка, которая требует удаления, имеет одну из двух строк в строке; "ОШИБКА" или "ССЫЛКА". Эти токены могут появиться в любом месте строки. Я хотел бы удалить эти строки, сохранив при этом все остальные строки.

Итак, если текстовый файл выглядит так:

 Хорошая строка данных 
 Плохая строка C:\Directory\ERROR\myFile.dll 
 Еще одна хорошая строка данных 
 Плохая строка: ССЫЛКА 
 Хорошая линия 

Я бы хотел, чтобы файл заканчивался так:

 Хорошая строка данных 
 Еще одна хорошая строка данных 
 Хорошая линия 

ТИА.

65
chrome

Используйте следующее:

type file.txt | findstr /v ERROR | findstr /v REFERENCE

Это дает преимущество использования стандартных инструментов в ОС Windows, а не необходимости искать и устанавливать sed/awk/Perl и тому подобное.

Смотрите следующую расшифровку для его работы:

 C: \> type file.txt 
 Хорошая строка данных 
 Плохая строка C:\Directory\ERROR\myFile.dll 
 Еще одна хорошая строка данных 
 плохая строка: ССЫЛКА 
 Хорошая строка 
 
 C: \> type file.txt | findstr/v ОШИБКА | findstr/v СПРАВОЧНИК 
 Хорошая строка данных 
 Еще одна хорошая строка данных 
 Хорошая линия 
98
paxdiablo

Вы можете выполнить то же решение, что и @ paxdiablo, используя сам findstr. Там нет необходимости передавать несколько команд вместе:

findstr /V "ERROR REFERENCE" infile.txt > outfile.txt

Детали того, как это работает:

  • / v находит строки, которые не соответствуют строке поиска (тот же ключ, который использует @paxdiablo)
  • если строка поиска в кавычках, она выполняет поиск OR, используя каждое слово (разделитель - пробел)
  • findstr может взять входной файл, вам не нужно вводить текст с помощью команды "type"
  • "> outfile.txt" отправит результаты в файл outfile.txt, а не печатает их на вашу консоль. (Обратите внимание, что файл будет перезаписан, если он существует. Вместо этого используйте ">> outfile.txt", если хотите добавить.)
  • Вы также можете рассмотреть возможность добавления параметра/i для сопоставления без учета регистра.
39
Rick

Если у вас есть sed:

sed -e '/ ССЫЛКА/d' -e '/ ОШИБКА/d' [FILENAME]

Где FILENAME - это имя текстового файла с хорошими и плохими строками

5
Rob

Если у вас установлен Perl, то Perl -i -n -e"print unless m{(ERROR|REFERENCE)}" поможет.

1
mirod