![]() |
Удаления строки ниже найденого текста.
Друзья, всем привет. Обычно по bat много инфы и все мои задачи давно уже решались и я их с легкостью находил, но сейчас не смог найти решение. Помогите пожалуйста.
Есть текстовый файл вида. произвольный текст произвольный текст произвольный текст txt1 произвольный текст произвольный текст произвольный текст произвольный текст txt1 произвольный текст произвольный текст произвольный текст txt1 произвольный текст произвольный текст произвольный текст произвольный текст Где: произвольный текст - это различный текст, не повторяющийся текст. text1 - это текст который не изменяется. Задача, найти в текстовом файле текст "txt1" удалить строчку где находиться этот текст и строчку ниже. |
|
Вложений: 1
Спасибо за быстрый ответ. Увы в файле есть информация которую не могу выложить. Но думаю Вы поймете вчем суть для примера прилагаю файл.
В файле 12 строк, в файле есть три строки где присутствует текст txt1 в строчках 5,7 и 11. Необходимо удалить эти строчки (5,7,11) и удалить строчки после них, строчки 6,8,12. Рабочий файл содержить почти 4000 строк. Текст по которому ищем строчки (text1) может расспологаться в различных строчках. Цитата:
|
Цитата:
Код:
1. произвольный текст Проверить маркер в строке №3 мы уже не можем, т.к. строка удалена... В сухом остатке: строку №4 удалять уже нельзя, т.к. не выполняются необходимые условия. А как должно быть? |
Цитата:
|
Цитата:
Цитата:
|
Цитата:
Примерно так: powershell Код:
$file = '.\in866.txt' Цитата:
Просто приходилось сталкиваться с подобной постановкой задачи, когда прилегающие, контекстные строки надо было учитывать... кстати, тот код ваял ещё на cmd и если хорошо поискать, то возможно даже он найдется... :) |
YuS_2,
Спасибо за код, увы не работает. Может что-то нетак делаю. Создал файл 123.bat, файл находиться в тойже папке что и файл in866.txt, запускай 123.bat, но нечего не меняется... Что я делаю нетак ? Пробовал в первой строчке прописать полный путь до файла in866.txt, не помогло. Цитата:
Файл состоит из блоков строк, один блок - это две строки, между блоками нет пустых строк. У всех блоков произвольный, разный, не повторяющийся текст. Но есть блоки где первая строчка содержит текст txt1 эти блоки необходимо удалить, тоесть удалить первую и вторую строчку блока. |
Цитата:
А на мои вопросы: Цитата:
|
Цитата:
То, что это не batch-сценарий, уже написали... В общем, скрипт необходимо сохранить в текстовом файле, с кодировкой UTF8 с BOM (это не единственная кодировка, но лучше в ней). Файл можно именовать как угодно, но расширение должно быть .ps1 Например: script.ps1 Далее, есть варианты... Скрипт можно запускать непосредственно из консоли powershell, либо ПКМ на файле скрипта и выбрать соответствующий пункт контекстного меню, либо создать batch-сценарий, например, run.bat: Код:
@echo off В общем, выбор за Вами... |
Проще всего задача решается с помощью sed:
Код:
sed "/txt1/,+1 d" input.txt Код:
1произвольный текст Код:
1произвольный текст |
Добавлю и своё до кучи (на PowerShell):
Скрытый текст
Код:
$sSourceFile = 'C:\Мои проекты\0272\in866 2.txt' |
Друзья большое всем спасибо за помощь, то что нужно.
Использую этот код, без паузы в конце. Код:
@echo off Код:
$file = '.\in866.txt' Кстати, если искать текст (маркер) вида 123+, то удаляет больше строк чем нужно. Возможно из-за "+", для меня это не критично. Попробую код от Iska |
Цитата:
Код:
123\+ |
Добрый день, как в PowerShell в скрипте ps сохранить результат не в utf8 c BOM а в формате utf8 без BOM
|
|
YuS_2, а разъясните, пожалуйста, как вот это работает:
Код:
% {$flg1,$flg2=$false,$false}{...} |
DJ Mogarych, насколько я понимаю, % — псевдоним командлета ForEach-Object, который поддерживает три скрипт-блока — Begin, Process и End. В данном случае использованы скрипт-блоки Begin и Process. Соответственно, в первом скрипт-блоке Begin двум переменным просто присваиваются два булевых значения, запись вида:
Код:
$flg1,$flg2=$false,$false Код:
$flg1=$false |
В случае с PowerShell можно было бы обойтись "многострочной" регуляркой, в смысле захватываем строку соответствующую критерию и следующую строку за ней. Это будет работать за рядом оговорок, но можно сделать несколько иначе.
Код:
$indexes = ($content = Get-Content .\file.txt -Encoding utf8) | |
Цитата:
А если, что-нибудь забудется, то можно всегда освежить в памяти, с подробностями и примерами: Код:
man foreach-object -s |
Я пытался "захватить следующую строку" с помощью Regex типа
Код:
".*txt1.*\n.*" Код:
".*txt1.*\r.*" Также, сначала убивал строку с паттерном, а потом пытался захватить пустую строку и следующую за ней: Код:
"\s+\n.*" |
Цитата:
Скрытый текст
Код:
$sContent = @' Цитата:
Шаблон будет нуждаться в доработке для охвата граничных случаев, но так-то — работает, не? |
|
Вот так не работает, хотя почему - непонятно.
Код:
(gc C:\temp\123.txt) -notmatch ".*txt1.*\n.*\n" Код:
(gc C:\temp\123.txt).GetType() |
DJ Mogarych, так — да, не будет работать, потому что командлет Get-Content возвращает именно массив отдельных строк (в которых нет символа \n), а не одну строку с символами «конец строки» внутри. Нужно добавить в командлет Get-Content параметр -Raw, тогда должно получиться то, что нужно.
|
Цитата:
Код:
(gc C:\temp\123.txt -raw) -notmatch ".*txt1.*\n.*\n" По сути, Ваша запись соответствует: Код:
gc C:\temp\123.txt|%{$_ -notmatch ".*txt1.*\n.*\n"} Код:
gc C:\temp\123.txt|%{$_;'==='} |
Спасибо!
Вот так работает: Код:
(gc C:\temp\123.txt -raw) -replace ".*txt1.*\n.*\n" |
Цитата:
|
Время: 15:08. |
Время: 15:08.
© OSzone.net 2001-