Видаліть певні рядки у текстовому файлі за допомогою командного файлу


77

У мене сформований txt-файл. Цей файл має певні рядки, які є зайвими, і їх потрібно видалити. Кожен рядок, який вимагає видалення, має один із двох рядків у рядку; "ПОМИЛКА" або "ДОВІДКА". Ці маркери можуть з’являтися де завгодно в рядку. Я хотів би видалити ці рядки, зберігаючи всі інші рядки.

Отже, якщо файл txt виглядає так:

Хороша лінія даних
неправильний рядок C: \ Directory \ ERROR \ myFile.dll
Ще одна хороша лінія даних
погана лінія: ДОВІДКА 
Хороша лінія

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

Хороша лінія даних
Ще одна хороша лінія даних
Хороша лінія

ТІА.

Відповіді:


107

Використовуйте наступне:

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

Ця перевага полягає у використанні стандартних інструментів в ОС Windows, а не у пошуку та встановленні sed / awk / perl тощо.

Дивіться наступну стенограму для цього в експлуатації:

C: \> введіть file.txt
Хороша лінія даних
неправильний рядок C: \ Directory \ ERROR \ myFile.dll
Ще одна хороша лінія даних
погана лінія: ДОВІДКА
Хороша лінія

C: \> введіть file.txt | findstr / v ПОМИЛКА | findstr / v ДОВІДКА
Хороша лінія даних
Ще одна хороша лінія даних
Хороша лінія

1
Чудово, просто рядок, який я шукав.
хром

5
Мав саме цю проблему і знайшов її тут на SO. Бог благословить переповнення стека !!
Метт Рогіш,

22
Щоб бути повним: вам потрібно додати "> output.txt" (без лапок), щоб висновок був записаний у файл.
Буркхард

Дякую, це було швидко і просто саме так, як мені подобається!
Куберхаун

2
дякую, це мені допомогло, але слово обережності, у мене були проблеми з фразами, включаючи пробіли, і мені доводилось використовувати / c: так команда буде виглядати так: type file.txt | findstr / v / c: "ПОМИЛКА" | findstr / v / c: "ДОВІДКА". Крім того, якщо вам потрібно зняти рядки, які, як ви знаєте, знаходяться у верхній частині файлу, проведіть його через більше + <n>, де <n> - це кількість рядків, які потрібно видалити.
Apeiron

45

Ви можете досягти того самого рішення, що і @ paxdiablo, використовуючи просто findstr сам по собі. Немає необхідності об'єднувати кілька команд разом:

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

Подробиці того, як це працює:

  • / v знаходить рядки, які не відповідають рядку пошуку (використовує той самий перемикач @paxdiablo)
  • якщо рядок пошуку в лапках, він виконує пошук АБО, використовуючи кожне слово (роздільник - пробіл)
  • findstr може взяти вхідний файл, вам не потрібно подавати йому текст за допомогою команди "type"
  • "> outfile.txt" надішле результати у файл outfile.txt, а не надрукує їх на вашу консоль. (Зверніть увагу, що він перезапише файл, якщо він існує. Натомість використовуйте ">> outfile.txt", якщо ви хочете додати.)
  • Ви також можете подумати про додавання перемикача / i для збігу регістру без урахування регістру.

типу! INSTALLED_APPS! | findstr / v "@ //"> temp_filter_out_junk.txt> nul 2> & 1
Mike Q

Я спробував це, type D:/e5/datastream/package.json | findstr /v eikon-framework | findstr /v df-coreале це не видаляє рядки
kittu

Я спробував findstr / V "eikon-framework df-core" D: \ e5 \ datastream \ package.json> D: \ e5 \ datastream \ package.json, але він видаляє весь вміст, якщо я спробую замінити дані в одному файлі і якщо я використовую інше назва файлу, що виводиться, тоді воно працює. Як оновити той самий файл?
kittu

@kittu Використовуйте ">>" замість ">". З відповіді: Замість цього використовуйте ">> outfile.txt", якщо ви хочете додати. Ви не можете змінити один і той же файл у цій одній команді.
Рік

6

Якщо у вас є sed:

sed -e '/REFERENCE/d' -e '/ERROR/d' [FILENAME]

Де FILENAMEназва текстового файлу з добрими і поганими рядками


1
Вам не потрібен -iпрапор?
prosoitos

1

Якщо у вас встановлено perl, тоді perl -i -n -e"print unless m{(ERROR|REFERENCE)}"слід зробити трюк.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.