Показать полную графическую версию : [решено] Поиск и замена текста
Уважаемые эксперты.
Просьба и помощи в написаниие командного файла: котолрый ищет текст в файле text.txt искомый текст находится в файле 1.txt и заменяет его на текст который находится в файле 2.txt соответственно.
Т.е. файлы 1 и 2 одинакового количества строк.
Спасибо заранее.
как-то так:@echo off
SETLOCAL DisableDelayedExpansion
for /f "tokens=1* delims=]" %%a in ('^<"1.txt" find /n /v ""') do (
for /f "tokens=1* delims=]" %%A in ('^<"2.txt" find /n /v ""') do (
if "%%a"=="%%A" set /a $n+=1& set "$_%%a=%%b=%%B"))
(for /f "tokens=1* delims=]" %%a in ('^<"text.txt" find /n /v ""') do (
set "$b=%%b"& SETLOCAL EnableDelayedExpansion
if defined $b for /f "tokens=1* delims==" %%x in ('set $_') do set "$b=!$b:%%y!"
echo.!$b!
ENDLOCAL))>"%~dpn0.tmp"
copy /y "%~dpn0.tmp" "text.txt" >nul&& del "%~dpn0.tmp"
ограничения данного варианта:
- строки файлов не должны начинаться символом "]"
- заменяемые строки (файл 1.txt) не должны содержать символа "="
- замена всегда производится без учета регистра
P.S. для русского текста последнее ограничение можно обойти использованием WIN-кодировки исходных файлов
Запускаю bat'ник и ничего просто висит окно консили и не происходит ничего(.
Убрал до 3 строк 1.txt и 2.txt
долго думал и написал "Попытка записи в несуществующий канал"
ajakzs, примеры файлов в тегах CODE
Я так полагаю, данный код работает, но очень медленно(
text.txt
(10,'','_dj_dj_re','f2039552c729323e7b13e895b95a2826'), (10,'','030708_bigmir37','9b7d17dd3c30904db2c209fc6b1532b0'), (10,'','11crickre','d4ceb7cd0cc27696575e3e7ae44edb60'), (10,'','44888888re','3740cada2337d33f26baa111fcec0240'), (10,'','6923521re','eed773f031031cddc0bc98f54fe33a06'), (10,'','9032615979re','5ebb14659eba8883dba2bd418e5dcf98'), (10,'','acidjazz333_5sw','c76663b69f4973b9c59f40f71be3c186'), (10,'','ae07_listsw','b219e5ab86ab19da2dd272fee95f82e2'), (10,'','akira_tmgamersw','61dc1cb715ff9d210dc15a06e717cd24'), (10,'','al19832004_5sw','e4220de586fde5906a150e343f0c29ba'), (10,'','aleks_khusainovre','c22642824ec1e27cc93fc1e6e2f98040'), (10,'-','AleksaN151_4sw','639cad05fcb877efa23fbe217fe48221'), (10,'','aleksec_5sw','c2c70d7b33535b1f835b2829bf9aec6c'), (10,'','aleksey-savre','3dd3e4e51687bd4b1aa681b6db450982'), (10,'','alex3alex3alexre','cd1a332e5e16e4a52943d74d14bd7f79'), (10,'','alexmord_yndexsw','d9b33e0e53575f1393d794c46cff78e9'), (10,'','alfa7308re','18520fd228815cb48b7ae7ffb3a030c6'), (10,'','Alisa-506_5sw','5d6783fe1210b5ca13c9c1f067fb50af'), (10,'','alla054_4sw','1cdcfe85ffd201eede00a3fd4e716e06'), (10,'','andrej_kuz7sovre','e7733b055a4b108ddb78eaebfe3667a0'),
1.txt
0004b1de7867c5680159aa5814301046 001697f3f07c991396649a75a5504ad8 00307fe544bc6b25c10c9afa85754630 c2c70d7b33535b1f835b2829bf9aec6c 3740cada2337d33f26baa111fcec0240
2.txt
stalker 444888 444888 444888 123 321
Только в оригинале text на 11k строк, а 1 и 2 по 4к
Запустил bat'nik часа два назад он до сих пор идет, и!
вижу темп файл весит 63Кб, а мой text.txt весит 763...
т.е. ждать еще невероятно долго?
в оригинале text на 11k строк, а 1 и 2 по 4к »
дык сразу предупреждать надо... :)
10к под переменные окружения это слишком
сторонние CMD-утилиты типа SED, AWK и пр. устроют?.. быстрее не бывает
Я несколько утилит уже попробовал, но не смог осилить) или они не смогли осилить мои команды.
А так конечно устроют = )
Если поможете правильно условия копирования\замены подскажете.
=))
полагаю, данный код работает, но очень медленно »
еще два момента:
1. "обнаружилось" еще одно ограничение чистого CMD-метода: длина строки text.txt не должна превышать 1024 символа, иначе скрипт её тупо обрежет... очевидно, предложенный файл не удовлетворяет этому требованию;
2. в первом посте было сказано, что шаблоны замены (1.txt, 2.txt) разделены строками, а в примере - пробелами... это глюк COPY/PASTE или неточность описания задачи?
конечно устроют »
вариант через AWK (http://gnuwin32.sourceforge.net/packages/gawk.htm)... при условии построчной замены 1.txt -> 2.txt
@awk -v T1="1.txt" -v T2="2.txt"^
"BEGIN{while(getline<T1){x=$0;getline<T2;a[x]=$0}};{for(v in a){gsub(v,a[v])};print}"^
"text.txt" >"%~dpn0.tmp"
@copy /y "%~dpn0.tmp" "text.txt" >nul&& @del "%~dpn0.tmp"
Devils0411
07-01-2012, 15:57
Ребятки, а каким образом можно заменить SetupSourcePath = "\" на SetupSourcePath = "\XP\"
через утилитку chgstr, не получается лишь потому, что в указанных строках есть ковычки, т.е. при запуске chgstr "SetupSourcePath = "\" "" SetupSourcePath = "\XP\"" "txtsetup.sif", то утилита просто подвисает и это понятно почему.
Devils0411
08-01-2012, 12:39
Решение проблемы нашел следующим способом:
findstr /v /c:"SetupSourcePath" txtsetup.sif >>txtsetup1.sif
SharkyEXE
20-03-2012, 09:26
Здравствуйте. Пожалуйста, напишите мне, как в файле ChkDistrMD Temp\Log
MD Temp\Log\Before
MD Temp\Log\After
Copy /Y Distr.ini Temp\Log >nul
If Exist Out.ini Copy /Y Out.ini Temp\Log >nul
Ver >Temp\Log\Nfo.txt
Echo %CD% >>Temp\Log\Nfo.txt
Copy /Y "%I386%\prodspec.ini" Temp\Log >nul
Copy /Y Temp\Folders.txt Temp\Log >nul
For %%I In (
svcpack.inf
svcpack.in_
sysoc.inf
sysoc.in_
wbemoc.in_
dosnet.inf
drvindex.inf
txtsetup.sif
) Do If Exist "%I386%\%%I" Copy /Y "%I386%\%%I" Temp\Log\Before >nul
Dir "%I386%" /OG /ON /S >Temp\Log\Before\I386.txt заменить только одну строку номер 1MD Temp\LogнаIf Not Exist Temp\Log MD Temp\LogВсе остальные строки в файле ChkDistr не трогать. Спасибо.
Здравствуйте.
Подскажите, пожалуйста, как сделать просто поиск текста в файле (не слова, а фразы с спец.символами) - если находит, то пишет лог, если нет - ничего не пишет.
Везде сложные примеры по замене текста, а мне это не надо, никак не догоню как сделать свою простую задачу :(
Подскажите пожалуйста, а как можно переделать этот пример кода (в самом низу сообщения) для awk так, чтобы была не построчная замена, а мултилайновая?
В текстовом файле есть текст:
text 001 blablalba
line
from
text XXX blablalba
line
from
text 002 blablalba
line
from
text 003 blablalba
line
from
в нем нужно найти строчки (одновременно):
text XXX blablalba
line
from
и заменить его на слово "layout". Надеюсь понятно объяснил)
Пример кода несколькими постами ранее:
@awk -v T1="1.txt" -v T2="2.txt"^
"BEGIN{while(getline<T1){x=$0;getline<T2;a[x]=$0}};{for(v in a){gsub(v,a[v])};print}"^
"text.txt" >"%~dpn0.tmp"
@copy /y "%~dpn0.tmp" "text.txt" >nul&& @del "%~dpn0.tmp"
чтобы была не построчная замена, а мултилайновая »в любом случае, AWK нужно сообщить, чем ограничивать мультилайновые блоки
например, пустыми строками, как в указанном примере:
@awk -v RS="" -v T1="1.txt" -v T2="2.txt"^
"BEGIN{while(getline<T1){x=$0;getline<T2;a[x]=$0}};{for(v in a){gsub(v,a[v])};print;print\"\"}"^
"text.txt" >"%~dpn0.tmp"
@copy /y "%~dpn0.tmp" "text.txt" >nul&& @del "%~dpn0.tmp"
text XXX blablalba
line
from
text YYY blablalba
line
from
layout1
layout2
text 001 blablalba
line
from
text XXX blablalba
line
from
text 002 blablalba
line
from
text YYY blablalba
line
from
text 003 blablalba
line
from
text 001 blablalba
line
from
layout1
text 002 blablalba
line
from
layout2
text 003 blablalba
line
from
amel27, огромнейшее Вам спасибо! Всё работает!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.