Имя пользователя:
Пароль:
 | Правила  

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

Ответить
Настройки темы
CMD/BAT - findstr при записи в тот же файл

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


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

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


Изменения
Автор: TolikD
Дата: 23-08-2018
Описание: покурил перенаправление вывода
Мне нужно удалить заданную строку в текстовом файле. Конкретно нужно удалить ай пи и перезаписать файл без данной строки.
Судя по ману команды findstr делается это так:
Код: Выделить весь код
findstr /I /V "192.168.1.101" test.txt
Результат будет вывод файла без искомой строки.
Однако, при добавлении кода с записью в тот же самый файл, текст в файле затирается полностью.
Батник:
Код: Выделить весь код
findstr /I /V "192.168.1.101" test.txt>test.txt
echo Press any key...
pause > nul
Результат: пустой файл test.txt. Что не так делаю?

PS А при чем тут единичка?
Старый текст темы
Как-то давным давно я уже сталкивался с этой проблемой на семёрке, убил в тот раз целый день и пришлось всё делать через зад. А щас то же самое на ДЕСЯТКЕ!!!
Кто-нибудь мне скажет что тут происходит???
Код: Выделить весь код
findstr /I /V "192.168.1.101" test.txt>test.txt
echo Press any key...
pause > nul
С кодом всё понятно вроде. Здесь командой findstr хочу убрать строку с айпи из файла.
Теперь выполняем батник.
Код: Выделить весь код
C:\debug\cmdtest>findstr /I /V "192.168.1.101" test.txt 1>test.txt

C:\debug\cmdtest>echo Press any key...
Press any key...

C:\debug\cmdtest>pause  1>nul
Главный вопрос: ОТКУДА ЭТА ЕДИНИЧКА???
В результате он мне затирает текст! Или я отстал от жизни или это фича???

Отправлено: 18:55, 23-08-2018

 

Ветеран


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

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


Цитата YuS_2:
это ведь несложно организовать, ежели возникнет такая необходимость, например так: »
Ну, вот — можете же .

Цитата YuS_2:
Но PCRE-совместимые регулярки - вещь в себе, т.е. достаточно универсальны, в основном...
Этот момент легко решается с помощью \Z »
Таки да. Добавляем в конец шаблона после символа «\n» символ «?»:
Код: Выделить весь код
Option Explicit

Dim strContent


strContent = _
	"192.168.1.101" & vbCrLf & _
	"192.168.1.98" & vbCrLf & _
	"192.168.1.99" & vbCrLf & _
	"192.168.1.100" & vbCrLf & _
	"192.168.1.101" & vbCrLf & _
	"#####192.168.1.101" & vbCrLf & _
	"192.168.1.101#####" & vbCrLf & _
	"#####192.168.1.101#####" & vbCrLf & _
	"192.168.1.102" & vbCrLf & _
	"192.168.1.103" & vbCrLf & _
	"192.168.1.104" & vbCrLf & _
	"192.168.1.101"

WScript.Echo _
	"--- Before: -----------------------------" & vbCrLf & _
	strContent & vbCrLf & _
	"-----------------------------------------" & vbCrLf

With WScript.CreateObject("VBScript.RegExp")
	.Pattern = "^.*192\.168\.1\.101.*$\n?"
	.Global = True
	.MultiLine = True
	
	If .Test(strContent) Then
		strContent = .Replace(strContent, "")
		
		WScript.Echo _
			"--- After: ------------------------------" & vbCrLf & _
			strContent & vbCrLf & _
			"-----------------------------------------" & vbCrLf
	Else
		WScript.Echo "Not found pattern [" & .Pattern & "]."
	End If
End With

WScript.Quit 0
и:
Скрытый текст

Цитата YuS_2:
Можете взять за основу шаблон из версии для PoSh... »
Напрямую не выйдет, слишком разные возможности в регулярках.

Цитата megaloman:
я даю скрипту подстроку произвольного вида. »
Да, к сожалению, в WSH нет такого хорошего средства, как метод Regex.Escape(String) Method (System.Text.RegularExpressions) | Microsoft Docs в .Net.
Это сообщение посчитали полезным следующие участники:

Отправлено: 22:50, 24-08-2018 | #31



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

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


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Ну, вот — можете же »
Да тут дело не в умении/не умении, это достаточно простая операция, а потому не очень интересная...

Цитата Iska:
Добавляем в конец шаблона после символа «\n» символ «?»: »
Все же, в этом случае, лучше так:
Код: Выделить весь код
[^\n]*192\.168\.1\.101[^\n]*\n?
потому как, в случае чтения текста единым массивом, .* со своей жадностью (особенно в случае (?s) ) может привести к неожиданным результатам, при \n? в конце шаблона.

Цитата Iska:
Напрямую не выйдет, слишком разные возможности в регулярках. »
Это да, вольные и урезанные реализации - зло, но тут и не надо напрямую, просто взять за основу...

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


Последний раз редактировалось YuS_2, 25-08-2018 в 00:08.

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

Отправлено: 23:32, 24-08-2018 | #32


Ветеран


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

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


Цитата YuS_2:
потому как, в случае чтения текста единым массивом, .* со своей жадностью (особенно в случае (?s) ) может привести к неожиданным результатам, при \n? в конце шаблона. »
Неа. Там ведь перед \n есть $. То есть, это — «конец строки, за которым сразу может следовать символ конца строки, а может и не следовать», вот такая интересная логика . Разумеется, это справедливо и работает только для установки:
Код: Выделить весь код
	.MultiLine = True
когда ^ и $ рассматриваются как «начало строки» и «конец строки», а не «начало текста» и «конец текста».
Это сообщение посчитали полезным следующие участники:

Отправлено: 23:58, 24-08-2018 | #33


Аватара для YuS_2

Crazy


Contributor


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

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


Цитата Iska:
Там ведь перед \n есть $ »
А, ну тоже верно... только это более частный случай, т.е. необходимо учитывать это обязательно.
А это:
Код: Выделить весь код
[^\n]*192\.168\.1\.101[^\n]*\n?
будет работать, при любом .MultiLine

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

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

Отправлено: 00:11, 25-08-2018 | #34


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


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

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


Цитата:
Не по теме: без findstr cmd+js без некошерного создания второго файла, пустые строки сохраняются, всякие непристойные символы сохраняются и не мешают. По сравнению с голым cmd длинный код
Удаляем строку, содержащую указанную подстроку
Не грубите писателю, он пишет как умеет
Ооо, а вот это именно то, что было нуно, готовое решение прямо таки!

Отправлено: 21:43, 27-08-2018 | #35



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Выключается при выполнении memtest Neschur Непонятные проблемы с Железом 2 16-09-2015 00:02
Медиа - Ошибка при выполнении приложения-сервера при открытии мультимедийных файлов Никон_Стадник@vk Microsoft Windows 7 2 01-02-2013 11:22
Лишний сайт при открытии браузер korobka_dv Лечение систем от вредоносных программ 1 06-12-2012 00:45
Ошибка - Ошибка при выполнении cmd KvoD Microsoft Windows 2000/XP 6 26-12-2010 21:55
[решено] Лишний диалог при установке Win2003 S32 Автоматическая установка Windows 2000/XP/2003 3 29-03-2007 13:28




 
Переход