![]() |
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Задать соответствие точному количеству и регистру символов. |
|
PowerShell - Задать соответствие точному количеству и регистру символов.
|
Новый участник Сообщения: 44 |
Здравствуйте. Для замены целой/части строки я использую данный скрипт:
Скрытый текст
$samples = Import-Csv '1.txt' -Encoding UTF8 -Delimiter ' ' -Header 'P1','P2' | select @{N='P1';E = {[regex]::Escape($_.P1)}},P2 $InFile = '2.txt' $OutFile = 'out.txt' # $JobCount = (gwmi win32_processor | measure NumberOfCores -S).Sum $JobCount = 4 # количество одновременно выполняющихся скрипт-блоков $Job_ReplaceText $TextBlockSize = 10000 # по сколько строк считывать для параллельной обработки в каждом скрипт-блоке $Job_ReplaceText $Job_ReplaceText = { foreach($sample in $args[1]) { $args[0] = $args[0] -replace $sample.P1,$sample.P2 } Return $args[0] } $n = 1 $null | Set-Content $OutFile foreach ($block in Get-Content $InFile -ReadCount $TextBlockSize -Encoding UTF8) { Start-Job -Name "Replace-$(($n++))" -ArgumentList $block,$samples -ScriptBlock $Job_ReplaceText if ($n -gt $JobCount) { $n = 1 Get-Job Replace-* | Wait-Job | sort Name | Receive-Job | Add-Content $OutFile -Encoding UTF8 Get-Job Replace-* | Remove-Job } } Get-Job Replace-* | Wait-Job | sort Name | Receive-Job | Add-Content $OutFile -Encoding UTF8 Get-Job Replace-* | Remove-Job Проблема в том, что скрипт не чувствителен к регистру и точности строки/части, которую необходимо заменить. Например в файле 1.txt подготовлены строки для замены (вначале стоит то, что искать а через пробел то, чем это заменить): Скрытый текст
textstroka1 newstroka1text
textstroka2 newstroka2text textstroka3 newstroka3text textstroka4 newstroka4text textstroka5 newstroka5text textstroka6 newstroka6text textstroka7 newstroka7text textstroka8 newstroka8text textstroka9 newstroka9text textstroka10 newstroka000text textstroka11 newstroka0000text В файле 2.txt содержится текст: Скрытый текст
textstroka1
textStroka2 textsTroka3 textstRoka4 textstrOka5 textstroka6 textstroka7 textstroka8 textstroka9 textstroka10 textstroka11 Результат работы скрипта получается такой, то есть строки 2,3,4 и 5 не должны быть изменены, так как регистр некоторых букв не соответствует, поисковому запросу. Кроме того строки 10 и 11 заменены некорректно, потому что не учтены все символы при поиске: Скрытый текст
newstroka1text
newstroka2text newstroka3text newstroka4text newstroka5text newstroka6text newstroka7text newstroka8text newstroka9text newstroka1text0 newstroka1text1 Задача состоит в том, чтобы скрипт выдавал следующее: Скрытый текст
newstroka1
textStroka2 textsTroka3 textstRoka4 textstrOka5 newstroka6 newstroka7 newstroka8 newstroka9 newstroka000text newstroka0000text Можно ли подправить данный скрипт, чтоб он производил замену в точности учитывая количество и регистр символов? |
|
Отправлено: 15:56, 29-12-2019 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать используйте метод replace вместо оператора -replace
|
Отправлено: 20:40, 29-12-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
fascinating rhythm Сообщения: 6705
|
Профиль | Отправить PM | Цитировать $samples = Import-Csv 'C:\temp\3\1.txt' -Encoding UTF8 -Delimiter ' ' -Header 'P1','P2' $InFile = gc 'C:\temp\3\2.txt' $OutFile = foreach ($string in $infile) { if ($string -cin $samples.p1) { ($samples |? p1 -ceq $string).p2 } else {$string} } $OutFile |Out-File 'C:\temp\3\out.txt' -Encoding UTF8 |
------- Отправлено: 23:26, 29-12-2019 | #3 |
Новый участник Сообщения: 44
|
Профиль | Отправить PM | Цитировать Цитата Busla:
Спасибо. С регистром все наладилось, а проблема с почти одинаковыми строками осталась. |
|
Отправлено: 01:25, 30-12-2019 | #4 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата DJ Mogarych:
Цитата temphard:
Цитата temphard:
Попробуйте: $frep = 'd:\test\1.txt' $fin = 'd:\test\2.txt' $fout = 'd:\test\out.txt' [array]$arr = import-csv $frep -enc utf8 -del ' ' -h 'p1','p2' gc $fin -enc utf8|%{ $tmp = $_ for ($i=0;$i -lt $arr.length;$i++){ if($tmp -cmatch "\b$($arr[$i].p1)\b"){ $tmp = $tmp -creplace $arr[$i].p1,$arr[$i].p2 } } $tmp } #|sc $fout -enc utf8 |
||||
------- Последний раз редактировалось YuS_2, 30-12-2019 в 08:10. Отправлено: 08:05, 30-12-2019 | #5 |
Ветеран Сообщения: 3806
|
Профиль | Отправить PM | Цитировать Цитата temphard:
Простая замена строк реализована в методе: |
|
Отправлено: 11:19, 30-12-2019 | #6 |
Crazy Сообщения: 1235
|
Профиль | Отправить PM | Цитировать Цитата Busla:
Цитата temphard:
Пример текста, для замены части строки - 9 строка
textstroka1
textStroka2 textsTroka3 textstRoka4 textstrOka5 textstroka6 textstroka7 textstroka8 textstroka9 textstroka11 textstroka10 textstroka11 |
||
------- Отправлено: 13:34, 30-12-2019 | #7 |
Новый участник Сообщения: 44
|
Профиль | Отправить PM | Цитировать Цитата YuS_2:
Просто использую цифры от 1 до 9 а дальше буквы алфавита: Скрытый текст
textstroka1
textstroka2 textstroka3 textstroka4 textstroka5 textstroka6 textstroka7 textstroka8 textstroka9 textstrokaА и т.д. В итоге код с задачей справляется. Всем спасибо за помощь и участие. |
|
Отправлено: 00:37, 31-12-2019 | #8 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - Как при запуске автоматически задать соответствие "все процессоры" в диспетчере задач | severagent007 | Microsoft Windows 7 | 4 | 04-01-2013 04:26 | |
Поиск по локальной сети по контексту и по количеству символов. | Dalretuo | Программное обеспечение Linux и FreeBSD | 1 | 15-01-2011 15:53 | |
Разное - Не могу задать соответствие процессоров | Gordon_Freeman0 | Microsoft Windows 2000/XP | 3 | 10-08-2010 21:52 | |
CMD/BAT - [решено] Как в CMD задать названию папки неопределенную последовательность символов? | Rico | Скриптовые языки администрирования Windows | 4 | 25-01-2010 08:16 | |
[решено] Задать соответствие процессу ядра процессора | alex911k | Microsoft Windows NT/2000/2003 | 2 | 18-11-2009 17:57 |
|