CMD/BAT - findstr при записи в тот же файл

Ответить
 • Просмотры: 2
Аватара пользователя
TolikD

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение TolikD »

Цитата TolikD:



Всё! Товарищ один помог, все недостатки for исправляются параметрами
CMD/BAT - findstr при записи в тот же файл




Зачем?

Зачем демонстрировать свою, как бы это сказать помягче... неосведомленность, в форме утверждений?

Задавай лучше вопросы, найдутся люди - подскажут обязательно... может быть не сразу, но подскажут.



Во-первых:


Цитата:



The maximum individual environment variable size is 8192bytes



расшифровать, что это означает?

Вот тебе рабочий вариант:



Код:

Код: Выделить всё

for /f "delims=" %%a in ('findstr /ivc:"192.168.1.101" test.txt^&del test.txt') do >>test.txt echo %%a

с пустыми строками разбирайся сам...



Во-вторых:

выше уже подсказали возможные траблы.



В-третьих:

Как я уже говорил, скорость обработки, также никуда не денется...

Тот вариант с промежуточным файлом, который предложен выше, обрабатывает файл в ~100000 строк (~1,2Mb) за:



Код:

Код: Выделить всё

Start: 24.08.2018  9:20:41,81
Stop: 24.08.2018  9:20:42,17

причем все символы и пустые строки сохраняются...



В общем, всё остальное (на cmd, естественно), при такой постановке задачи - от лукавого... даже если возникнет иллюзия нормальной работы. ;-)
Аватара пользователя
Iska

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение Iska »

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

Удаляем строку, содержащую указанную подстроку

Не грубите писателю, он пишет как умеет

[spoiler]

Код: Выделить всё

@set @E=1; /*
@Echo Off
cls
       	Set "FileIn=Z:\Box_In\Улицы разбитых фонарей 22.txt"
	Set "DelFind=192.168.1.101"
	Cscript //NoLogo /E:jscript "%~dpnx0" "%FileIn%" "%DelFind%"  
pause
GoTo :Eof
*/
var oArg = WScript.Arguments;
var nArg = oArg.Count();
if (nArg < 2) {
	WScript.Echo("Error! Invalid number of arguments!");
	WScript.Quit(240);
}
var FText=oArg(0);
var FSO=WScript.CreateObject("Scripting.FileSystemObject");
var InFile;
try {InFile = FSO.OpenTextFile(FText,1);}
catch (e) {
   if (e !=0 ) {
	WScript.Echo("Error! " + FText + "  " + e.description);
       	WScript.Quit(1);
     }
}
var TextAll = InFile.ReadAll();
InFile.Close();
var i0 = TextAll.indexOf(oArg(1));
if (i0 < 0) {
	WScript.Echo("Error! String not found! \n" + oArg(1));
	WScript.Quit(2);
}
var C10=String.fromCharCode(10);
var i1 = TextAll.lastIndexOf(C10,i0);
var i2 = TextAll.indexOf(C10,i0);
if (i1 < 0 && i2 < 0) {
	TextAll="";
}
else
{
	if (i2 < 0) {TextAll=TextAll.substring(0,i1+1)};
	if (i1 <= 0) {TextAll = TextAll.substring(i2+1,TextAll.length)};
	if (i1 >0 && i2 >= 0) {TextAll=TextAll.substring(0,i1+1) + TextAll.substring(i2+1,TextAll.length)};
}
InFile = FSO.OpenTextFile(FText,2);
InFile.Write(TextAll);
InFile.Close();
[/spoiler]
Аватара пользователя
megaloman

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение megaloman »

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

Удаляем строку, содержащую указанную подстроку

Не грубите писателю, он пишет как умеет

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@set @E=1; /*
@Echo Off
cls
       	Set "FileIn=Z:\Box_In\Улицы разбитых фонарей 22.txt"
	Set "DelFind=192.168.1.101"
	Cscript //NoLogo /E:jscript "%~dpnx0" "%FileIn%" "%DelFind%"  
pause
GoTo :Eof
*/
var oArg = WScript.Arguments;
var nArg = oArg.Count();
if (nArg < 2) {
	WScript.Echo("Error! Invalid number of arguments!");
	WScript.Quit(240);
}
var FText=oArg(0);
var FSO=WScript.CreateObject("Scripting.FileSystemObject");
var InFile;
try {InFile = FSO.OpenTextFile(FText,1);}
catch (e) {
   if (e !=0 ) {
	WScript.Echo("Error! " + FText + "  " + e.description);
       	WScript.Quit(1);
     }
}
var TextAll = InFile.ReadAll();
InFile.Close();
var i0 = TextAll.indexOf(oArg(1));
if (i0 < 0) {
	WScript.Echo("Error! String not found! \n" + oArg(1));
	WScript.Quit(2);
}
var C10=String.fromCharCode(10);
var i1 = TextAll.lastIndexOf(C10,i0);
var i2 = TextAll.indexOf(C10,i0);
if (i1 < 0 && i2 < 0) {
	TextAll="";
}
else
{
	if (i2 < 0) {TextAll=TextAll.substring(0,i1+1)};
	if (i1 0 && i2 >= 0) {TextAll=TextAll.substring(0,i1+1) + TextAll.substring(i2+1,TextAll.length)};
}
InFile = FSO.OpenTextFile(FText,2);
InFile.Write(TextAll);
InFile.Close();
Аватара пользователя
Iska

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение Iska »

Цитата Iska:



если пользовать JScript, то удобнее регуляркой
CMD/BAT - findstr при записи в тот же файл




в этой задаче - какая в них радость?
Аватара пользователя
Iska

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение Iska »

Цитата megaloman:



Не грубите писателю, он пишет как умеет
CMD/BAT - findstr при записи в тот же файл




Изображение Изображение




Цитата megaloman:



без некошерного создания второго файла
CMD/BAT - findstr при записи в тот же файл





Цитата megaloman:



длинный код
CMD/BAT - findstr при записи в тот же файл




тогда кошерный и короткий powershell:



Код:

Код: Выделить всё

(gc test.txt -raw) -replace '(?<=^|\n)[^\n]*192\.168\.1\.101[^\n]*\n'|sc test.txt -non

Изображение




Цитата megaloman:



какая в них радость?
CMD/BAT - findstr при записи в тот же файл




код будет значительно короче...
Аватара пользователя
YuS_2

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение YuS_2 »

Цитата megaloman:



в этой задаче - какая в них радость?
CMD/BAT - findstr при записи в тот же файл




В использовании одного .test() и одного .replace(). Это ведь вроде как должно быть проще, не?




Цитата YuS_2:



тогда кошерный и короткий powershell:
CMD/BAT - findstr при записи в тот же файл




Я таки ратую за присутствие в коде аналога .test() — ::IsMatch(), дабы не переписывать файл при отсутствии замен.
Аватара пользователя
Iska

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение Iska »

Iska, Я делал задачу для случая, когда искомая подстрока входит в строку, которую надо удалить. Строка в любом месте текста, может быть первая, может быть последняя. Реплейс, конечно, заманчиво, но не сообразил, как нарисовать регулярку, напряжно ...

Как альтернатива, читать текст построчно
Аватара пользователя
megaloman

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение megaloman »

Iska, Я делал задачу для случая, когда искомая подстрока входит в строку, которую надо удалить. Строка в любом месте текста, может быть первая, может быть последняя. Реплейс, конечно, заманчиво, но не сообразил, как нарисовать регулярку, напряжно ...

Как альтернатива, читать текст построчно
Аватара пользователя
Iska

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение Iska »

Цитата Iska:



Я таки ратую за присутствие в коде
CMD/BAT - findstr при записи в тот же файл




понимаю, принимаю и всегда только за... это ведь несложно организовать, ежели возникнет такая необходимость, например так:



Код:

Код: Выделить всё

$re = '(?<=\A|\n)[^\n]*192\.168\.1\.101[^\n]*(\n|\Z)'
if(($a = gc test.txt -raw) -match $re){$a -replace $re|sc test.txt -non}


Цитата Iska:



Не сработает только для одного случая — когда «192.168.1.101» будет в последней строке
CMD/BAT - findstr при записи в тот же файл




Кстати, да, у меня тоже не было учтено...

Но PCRE-совместимые регулярки - вещь в себе, т.е. достаточно универсальны, в основном...

Этот момент легко решается с помощью \Z




Цитата megaloman:



Реплейс, конечно, заманчиво, но не сообразил, как нарисовать регулярку, напряжно ...

Как альтернатива, читать текст построчно
CMD/BAT - findstr при записи в тот же файл




Можете взять за основу шаблон из версии для PoSh...

Читать и парсить текст построчно, при достаточно большом объеме - тоскливое занятие (по скорости), хоть и более привлекательное, с точки зрения настраиваемости обработки.
Аватара пользователя
YuS_2

Re: CMD/BAT - findstr при записи в тот же файл

Сообщение YuS_2 »

Iska, прочесть файл в строку, добавить конец строки в конец, обработать, что получилось - записать без последнего символа. Всё отработает, но задачка получается очень частная: в моём тупом подходе - я даю скрипту подстроку произвольного вида. Если делать регулярку - получаем частное решение. Но красивое.

Наверное, если передавать js (=vbs) скрипту не подстроку для поиска, а рег. выражение, то прокатит.
Ответить

Вернуться в «Скриптовые языки администрирования Windows»