Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаления строки ниже найденого текста.

Ответить
Настройки темы
CMD/BAT - [решено] Удаления строки ниже найденого текста.

Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Друзья, всем привет. Обычно по bat много инфы и все мои задачи давно уже решались и я их с легкостью находил, но сейчас не смог найти решение. Помогите пожалуйста.

Есть текстовый файл вида.

произвольный текст
произвольный текст
произвольный текст txt1 произвольный текст
произвольный текст
произвольный текст
произвольный текст txt1 произвольный текст
произвольный текст
произвольный текст txt1 произвольный текст
произвольный текст
произвольный текст
произвольный текст

Где:
произвольный текст - это различный текст, не повторяющийся текст.
text1 - это текст который не изменяется.

Задача, найти в текстовом файле текст "txt1" удалить строчку где находиться этот текст и строчку ниже.

Отправлено: 10:45, 15-08-2019

 

Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


Проще всего задача решается с помощью sed:
Код: Выделить весь код
sed "/txt1/,+1 d" input.txt
В итоге из:
Код: Выделить весь код
1произвольный текст
2произвольный текст
3произвольный текст txt1 произвольный текст
4произвольный текст
5произвольный текст
6произвольный текст txt1 произвольный текст
7произвольный текст
8произвольный текст txt1 произвольный текст
9произвольный текст
10произвольный текст
11произвольный текст
Получим:
Код: Выделить весь код
1произвольный текст
2произвольный текст
5произвольный текст
10произвольный текст
11произвольный текст
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:19, 15-08-2019 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Добавлю и своё до кучи (на PowerShell):
Скрытый текст
Код: Выделить весь код
$sSourceFile  = 'C:\Мои проекты\0272\in866 2.txt'
$sString4Find = 'txt1'


$sPattern = ".*$sString4Find.*`r`n.*(?:`r`n|$)"

if([System.IO.File]::Exists($sSourceFile)) {
    $sContent = Get-Content -Path $sSourceFile -Encoding UTF8 -Raw

    if([Regex]::IsMatch($sContent, $sPattern)) {
        
        [Regex]::Replace($sContent, $sPattern, '') | Set-Content -Path $sSourceFile -Encoding UTF8 -NoNewline
        Write-Host "Found [$sString4Find] and replaced in content of source file [$sSourceFile]." -ForegroundColor Green
    } else {
        Write-Host "Not found [$sString4Find] in content of source file [$sSourceFile]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find source file [$sSourceFile]." -ForegroundColor Red
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:13, 16-08-2019 | #12


Новый участник


Сообщения: 5
Благодарности: 0

Профиль | Отправить PM | Цитировать


Друзья большое всем спасибо за помощь, то что нужно.

Использую этот код, без паузы в конце.
Код: Выделить весь код
@echo off
echo Выполняем...
powershell -ex bypass .\script.ps1
echo Готово.
pause
Для запуска этого.
Код: Выделить весь код
$file = '.\in866.txt'
$mrk = 'txt1'
$enc = 'utf8'

$a = gc $file -enc $enc|%{$flg1,$flg2=$false,$false}{
	if($_ -match $mrk){
		$flg1=$true
		$flg2=$true
	} elseif ($flg1 -and $flg2){
		$flg2=$false
	} else {
		$_
		$flg1=$false
		$flg2=$true
	}
}
$a|sc $file -enc $enc
Ребята, еще раз, от души спасибо. Нужно сделать на форуме кнопки доната для пользователей. Готов задонатить.

Кстати, если искать текст (маркер) вида 123+, то удаляет больше строк чем нужно. Возможно из-за "+", для меня это не критично.

Попробую код от Iska

Последний раз редактировалось Grade24, 16-08-2019 в 14:26.


Отправлено: 14:17, 16-08-2019 | #13


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата Grade24:
Кстати, если искать текст (маркер) вида 123+, то удаляет больше строк чем нужно. Возможно из-за "+", для меня это не критично. »
Всё так. «+» в шаблоне регулярного выражения имеет специальный смысл — это квалификатор, означающий «предыдущий символ шаблона должен встретиться один или более раз». Чтобы использовать сам символ плюс, нужно его экранировать другим специальным символом:
Код: Выделить весь код
123\+
Вот здесь: Элементы языка регулярных выражений — краткий справочник | Microsoft Docs Вы можете загрузить (Загрузить в формате Word (DOCX) Download in Word (.docx) format) краткую справку по символам регулярных выражений .Net Framework.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:43, 16-08-2019 | #14


Новый участник


Сообщения: 14
Благодарности: 0

Профиль | Отправить PM | Цитировать


Добрый день, как в PowerShell в скрипте ps сохранить результат не в utf8 c BOM а в формате utf8 без BOM

Отправлено: 09:26, 19-08-2019 | #15


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Примерно так.

Отправлено: 15:24, 19-08-2019 | #16


Аватара для DJ Mogarych

fascinating rhythm


Moderator


Сообщения: 6491
Благодарности: 1465

Профиль | Отправить PM | Цитировать


YuS_2, а разъясните, пожалуйста, как вот это работает:
Код: Выделить весь код
% {$flg1,$flg2=$false,$false}{...}
Почему после % идёт два скриптблока, и что задаётся в первом?

-------
Powershell 7.x | Powershell 5.1 | ffmpeg (docs)


Отправлено: 13:52, 23-08-2019 | #17


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


DJ Mogarych, насколько я понимаю, % — псевдоним командлета ForEach-Object, который поддерживает три скрипт-блока — Begin, Process и End. В данном случае использованы скрипт-блоки Begin и Process. Соответственно, в первом скрипт-блоке Begin двум переменным просто присваиваются два булевых значения, запись вида:
Код: Выделить весь код
$flg1,$flg2=$false,$false
аналогична более привычной записи:
Код: Выделить весь код
$flg1=$false
$flg2=$false
Данная конструкция, именуемая «параллельное присваивание», вида «список переменных=список выражений», присутствует во многих современных языках — Lua, Python и пр.

Последний раз редактировалось Iska, 23-08-2019 в 14:53. Причина: Уточнение.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:20, 23-08-2019 | #18


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


В случае с PowerShell можно было бы обойтись "многострочной" регуляркой, в смысле захватываем строку соответствующую критерию и следующую строку за ней. Это будет работать за рядом оговорок, но можно сделать несколько иначе.
Код: Выделить весь код
$indexes = ($content = Get-Content .\file.txt -Encoding utf8) |
Select-String txt1 | ForEach-Object {++($$ = ,(--$_.LineNumber) * 2)[1];$$}

0..($content.Length - 1) | Where-Object {$indexes -notcontains $_} |
ForEach-Object {$content[$_]} | Out-File .\cleaned.txt -Encoding utf8
В более поздних нежели v2 версиях PowerShell, данный подход можно еще более сократить за счет оператора -notin, методов расширений и т.д., в результате чего решение будет похоже скорее на black magic, примерно такое же как в случае с "многострочной" регуляркой.
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:11, 23-08-2019 | #19


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1171
Благодарности: 487

Профиль | Отправить PM | Цитировать


Цитата DJ Mogarych:
разъясните, пожалуйста, как вот это работает »
Да, Iska, верно описал работу конструкции и добавить особо нечего...
А если, что-нибудь забудется, то можно всегда освежить в памяти, с подробностями и примерами:
Код: Выделить весь код
man foreach-object -s

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:42, 23-08-2019 | #20



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Удаления строки ниже найденого текста.

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - Нужно написать скрипт на VBS для удаления строки. X0E2003 Скриптовые языки администрирования Windows 1 18-02-2015 09:11
CMD/BAT - [решено] Нужен Батник для удаления части строки d_coder@vk Скриптовые языки администрирования Windows 1 18-03-2014 10:02
Поиск строки текста в группе файлов Serg2010 AutoIt 3 15-05-2013 06:29
2003/XP/2000 - [решено] сбилась функция автоматического удаления выделенного текста клавишей BackSpace myohoji Microsoft Office (Word, Excel, Outlook и т.д.) 3 19-11-2012 18:57
2010 - Word, как сделать, чтобы "Отступ" ниже текста не перемещался вместе с шапкой? HarrysFerrarievich Microsoft Office (Word, Excel, Outlook и т.д.) 9 31-10-2011 01:45




 
Переход