Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Поиск и замена текста (http://forum.oszone.net/showthread.php?t=188782)

ajakzs 19-10-2010 19:29 1522515

Поиск и замена текста
 
Уважаемые эксперты.

Просьба и помощи в написаниие командного файла: котолрый ищет текст в файле text.txt искомый текст находится в файле 1.txt и заменяет его на текст который находится в файле 2.txt соответственно.
Т.е. файлы 1 и 2 одинакового количества строк.

Спасибо заранее.

amel27 20-10-2010 04:25 1522782

как-то так:
Код:

@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-кодировки исходных файлов

ajakzs 20-10-2010 12:47 1523017

Запускаю bat'ник и ничего просто висит окно консили и не происходит ничего(.
Убрал до 3 строк 1.txt и 2.txt
долго думал и написал "Попытка записи в несуществующий канал"

amel27 20-10-2010 13:24 1523056

ajakzs, примеры файлов в тегах CODE

ajakzs 20-10-2010 14:18 1523111

Я так полагаю, данный код работает, но очень медленно(

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к

ajakzs 20-10-2010 15:55 1523199

Запустил bat'nik часа два назад он до сих пор идет, и!
вижу темп файл весит 63Кб, а мой text.txt весит 763...
т.е. ждать еще невероятно долго?

amel27 20-10-2010 16:08 1523209

Цитата:

Цитата ajakzs
в оригинале text на 11k строк, а 1 и 2 по 4к »

дык сразу предупреждать надо... :)
10к под переменные окружения это слишком

сторонние CMD-утилиты типа SED, AWK и пр. устроют?.. быстрее не бывает

ajakzs 20-10-2010 16:17 1523213

Я несколько утилит уже попробовал, но не смог осилить) или они не смогли осилить мои команды.

А так конечно устроют = )

ajakzs 20-10-2010 19:33 1523406

Если поможете правильно условия копирования\замены подскажете.
=))

amel27 21-10-2010 03:12 1523659

Цитата:

Цитата ajakzs
полагаю, данный код работает, но очень медленно »

еще два момента:

1. "обнаружилось" еще одно ограничение чистого CMD-метода: длина строки text.txt не должна превышать 1024 символа, иначе скрипт её тупо обрежет... очевидно, предложенный файл не удовлетворяет этому требованию;

2. в первом посте было сказано, что шаблоны замены (1.txt, 2.txt) разделены строками, а в примере - пробелами... это глюк COPY/PASTE или неточность описания задачи?

amel27 21-10-2010 06:14 1523677

Цитата:

Цитата ajakzs
конечно устроют »

вариант через AWK... при условии построчной замены 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"


ajakzs 21-10-2010 09:30 1523754

Отличное решение!

Devils0411 07-01-2012 15:57 1830242

Ребятки, а каким образом можно заменить SetupSourcePath = "\" на SetupSourcePath = "\XP\"
через утилитку chgstr, не получается лишь потому, что в указанных строках есть ковычки, т.е. при запуске chgstr "SetupSourcePath = "\" "" SetupSourcePath = "\XP\"" "txtsetup.sif", то утилита просто подвисает и это понятно почему.

Devils0411 08-01-2012 12:39 1830816

Решение проблемы нашел следующим способом:
Код:

findstr /v /c:"SetupSourcePath" txtsetup.sif >>txtsetup1.sif

SharkyEXE 20-03-2012 09:26 1883040

Здравствуйте. Пожалуйста, напишите мне, как в файле ChkDistr
читать дальше »
Код:

MD 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

заменить только одну строку номер 1
читать дальше »
Код:

MD Temp\Log
на
читать дальше »
Код:

If Not Exist Temp\Log MD Temp\Log
Все остальные строки в файле ChkDistr не трогать. Спасибо.

n1gt 02-05-2012 14:19 1909190

Здравствуйте.
Подскажите, пожалуйста, как сделать просто поиск текста в файле (не слова, а фразы с спец.символами) - если находит, то пишет лог, если нет - ничего не пишет.
Везде сложные примеры по замене текста, а мне это не надо, никак не догоню как сделать свою простую задачу :(

Дивер 07-08-2013 19:00 2198082

Подскажите пожалуйста, а как можно переделать этот пример кода (в самом низу сообщения) для 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"


amel27 08-08-2013 06:08 2198267

Цитата:

Цитата Дивер
чтобы была не построчная замена, а мултилайновая »

в любом случае, 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"

1.txt
Код:

text XXX blablalba
line
from

text YYY blablalba
line
from

2.txt
Код:

layout1

layout2


исходный TEXT.TXT
Код:

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.TXT
Код:

text 001 blablalba
line
from

layout1

text 002 blablalba
line
from

layout2

text 003 blablalba
line
from


Дивер 08-08-2013 16:10 2198496

amel27, огромнейшее Вам спасибо! Всё работает!


Время: 17:34.

Время: 17:34.
© OSzone.net 2001-