PDA

Показать полную графическую версию : [решено] Поиск и замена текста


ajakzs
19-10-2010, 19:29
Уважаемые эксперты.

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

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

amel27
20-10-2010, 04:25
как-то так:@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
Запускаю bat'ник и ничего просто висит окно консили и не происходит ничего(.
Убрал до 3 строк 1.txt и 2.txt
долго думал и написал "Попытка записи в несуществующий канал"

amel27
20-10-2010, 13:24
ajakzs, примеры файлов в тегах CODE

ajakzs
20-10-2010, 14:18
Я так полагаю, данный код работает, но очень медленно(

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

amel27
20-10-2010, 16:08
в оригинале text на 11k строк, а 1 и 2 по 4к »
дык сразу предупреждать надо... :)
10к под переменные окружения это слишком

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

ajakzs
20-10-2010, 16:17
Я несколько утилит уже попробовал, но не смог осилить) или они не смогли осилить мои команды.

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

ajakzs
20-10-2010, 19:33
Если поможете правильно условия копирования\замены подскажете.
=))

amel27
21-10-2010, 03:12
полагаю, данный код работает, но очень медленно »
еще два момента:

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

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

amel27
21-10-2010, 06:14
конечно устроют »
вариант через 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"

ajakzs
21-10-2010, 09:30
Отличное решение!

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 не трогать. Спасибо.

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

Дивер
07-08-2013, 19:00
Подскажите пожалуйста, а как можно переделать этот пример кода (в самом низу сообщения) для 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
чтобы была не построчная замена, а мултилайновая »в любом случае, 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

Дивер
08-08-2013, 16:10
amel27, огромнейшее Вам спасибо! Всё работает!




© OSzone.net 2001-2012