![]() |
findstr при записи в тот же файл
Мне нужно удалить заданную строку в текстовом файле. Конкретно нужно удалить ай пи и перезаписать файл без данной строки.
Судя по ману команды findstr делается это так: Код:
findstr /I /V "192.168.1.101" test.txt Однако, при добавлении кода с записью в тот же самый файл, текст в файле затирается полностью. Батник: Код:
findstr /I /V "192.168.1.101" test.txt>test.txt PS А при чем тут единичка? Старый текст темы
Как-то давным давно я уже сталкивался с этой проблемой на семёрке, убил в тот раз целый день и пришлось всё делать через зад. А щас то же самое на ДЕСЯТКЕ!!!
Кто-нибудь мне скажет что тут происходит??? Код:
findstr /I /V "192.168.1.101" test.txt>test.txt Теперь выполняем батник. Код:
C:\debug\cmdtest>findstr /I /V "192.168.1.101" test.txt 1>test.txt В результате он мне затирает текст! Или я отстал от жизни или это фича??? |
Цитата:
Цитата:
единичка - это числовой эквивалент дескриптора вывода в консоль, который перенаправлен в nul. Но с кодом, всё же, Вы недопонимаете... Код:
>test_out.txt findstr /ivc:"192.168.1.101" test.txt |
Привет!
У меня было мнение, что причина в единичке, якобы команда определяет лишний символ в параметрах. Но похоже что проблема глубже... Ну так и что? Тема сводится к обсуждению как убрать строку с айпи? Твой код тоже не работает. Точнее он работает при вводе команды без перенаправления в левый файл, как работает и у меня. А вот в тот же файл почему-то облом. Пора тему переименовать в разборки с командой findstr... |
Цитата:
1. Когда Вы используйте в таком виде вывод в файл в той же команде, которой пытаетесь читать из него — происходит следующее: Скрытый текст
![]() В итоге — как видите, Ваша команда радостно пытается читать из уже пустого файла. Вы обратили внимание, что у коллеги YuS_2 идёт чтение из одного файла, а вывод делается в другой? 2. Единичка в: Цитата:
Цитата:
Цитата:
Цитата:
|
Ну затирает он вначале и что? Из скриншота я не понял, и хде там решение проблемы?!
Код:
echo 123>test.txt точно я отстал от жизни, пора вешаться... |
Цитата:
Цитата:
Цитата:
Цитата:
|
Ну и переименуй... Или я один туплю?
Код:
c:\debug\cmdtest>type test.txt |
|
Цитата:
При чем тут манеры? в итоге я прав Ну есть же решение, только без записи в левый файл. Как это сделать ума не приложу... |
Цитата:
Код:
<test.txt>+ findstr /ivc:"192.168.1.101"&move+ test.txt Религиозные принципы мешают? :) |
Зачем? Я и так мог бы наплодить кучу го%нокода и не подымать тему. Дело принципа. И всё можно, вот решение:
Код:
for /f "usebackq" %%a in (`findstr /V "192.168.1.101" test.txt`) do (set content=%%a) |
Цитата:
1. Добавь в свой файл несколько строк и увидишь, почему го%нокод (его можно исправить, кстати) 2. Добавь в свой файл тысяч сто строк и замеряй скорость обработки (даже в случае с исправленным вариантом) 3. Посыпать голову пеплом не требуется, но манеры свои, всё же, подправь... на будущее. |
Цитата:
Цитата:
Цитата:
Решение же банально — разнести чтение из и вывод в один и тот же файл, не делать этого одновременно в пределах одной команды. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Код:
@echo off ![]() |
Цитата:
тут главное непонятно: зачем именно такое действие, что за религия запрещает применение промежуточного файла? ... в любом случае, представленный выше вариант, это наиболее быстрый вариант. Можно, конечно, через цикл for такое осуществить (как попытался сделать ТС, пусть и коряво...), т.к. команды, результат которых разбирается в цикле, выполняются в новом процессе, но это очень медленно и неэффективно в итоге, плюс ещё со своими особенностями (такими как съедание пустых строк и т.п.) |
Цитата:
|
Цитата:
|
|
Цитата:
|
Всё! Товарищ один помог, все недостатки for исправляются параметрами, но всё равно корявенько получилось эт да! Батники в винде, когда дело касается обработки текста - это конечно же ещё та мозголомка башка кипит.
Код:
setlocal enableDelayedExpansion |
Цитата:
Цитата:
Код:
@echo off ![]() — добро пожаловать в смешанный мир Windows+Unix! CrLf и Lf в одном флаконе! Как поведёт себя приложение, которое должно будет работать с получившимся кадавром — вопрос. |
Цитата:
Зачем демонстрировать свою, как бы это сказать помягче... неосведомленность, в форме утверждений? Задавай лучше вопросы, найдутся люди - подскажут обязательно... может быть не сразу, но подскажут. Во-первых: Цитата:
Вот тебе рабочий вариант: Код:
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 В общем, всё остальное (на cmd, естественно), при такой постановке задачи - от лукавого... даже если возникнет иллюзия нормальной работы. ;-) |
Не по теме: без findstr cmd+js без некошерного создания второго файла, пустые строки сохраняются, всякие непристойные символы сохраняются и не мешают. По сравнению с голым cmd длинный код
Удаляем строку, содержащую указанную подстроку Не грубите писателю, он пишет как умеет Код:
@set @E=1; /* |
megaloman, если пользовать JScript, то удобнее регуляркой.
|
Цитата:
|
Цитата:
Цитата:
Цитата:
Код:
(gc test.txt -raw) -replace '(?<=^|\n)[^\n]*192\.168\.1\.101[^\n]*\n'|sc test.txt -non Цитата:
|
Цитата:
Цитата:
|
Iska, Я делал задачу для случая, когда искомая подстрока входит в строку, которую надо удалить. Строка в любом месте текста, может быть первая, может быть последняя. Реплейс, конечно, заманчиво, но не сообразил, как нарисовать регулярку, напряжно ...
Как альтернатива, читать текст построчно |
Я Вам нарисую, но только для VBScript, без файла и без каких-либо проверок, а Вы сами тогда на JScript переведёте, лады? Мой JScript оставляет желать лучшего.
Код:
Option Explicit Скрытый текст
![]() P.S. Не сработает только для одного случая — когда «192.168.1.101» будет в последней строке, и эта строка не будет завершаться символами конца строки. |
Цитата:
Код:
$re = '(?<=\A|\n)[^\n]*192\.168\.1\.101[^\n]*(\n|\Z)' Цитата:
Но PCRE-совместимые регулярки - вещь в себе, т.е. достаточно универсальны, в основном... Этот момент легко решается с помощью \Z Цитата:
Читать и парсить текст построчно, при достаточно большом объеме - тоскливое занятие (по скорости), хоть и более привлекательное, с точки зрения настраиваемости обработки. |
Iska, прочесть файл в строку, добавить конец строки в конец, обработать, что получилось - записать без последнего символа. Всё отработает, но задачка получается очень частная: в моём тупом подходе - я даю скрипту подстроку произвольного вида. Если делать регулярку - получаем частное решение. Но красивое.
Наверное, если передавать js (=vbs) скрипту не подстроку для поиска, а рег. выражение, то прокатит. |
Цитата:
Цитата:
Код:
Option Explicit Скрытый текст
![]() Цитата:
Цитата:
|
Цитата:
Цитата:
Код:
[^\n]*192\.168\.1\.101[^\n]*\n? Цитата:
|
Цитата:
Код:
.MultiLine = True |
Цитата:
А это: Код:
[^\n]*192\.168\.1\.101[^\n]*\n? |
Цитата:
|
Время: 12:53. |
Время: 12:53.
© OSzone.net 2001-