Компьютерный форум 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=251974)

Anderwood 21-01-2013 08:47 2071451

Потребовалось заменить текст в файлах
 
Доброго дня.
Потребовалось заменить текст в файлах.
Например в файле В34567.smt найти все 4567#В4#5676 и заменить их на 4567#БЫР4#5676.
При этом помимо этого в тексте может содержаться фразы имеющие в себе эту букву "В" например "Всегда так делал" , нужно это учесть и не заменять букву в предложениях. Текст в файле на русском языке, замена происходит так же русских символов.
Интересует реализация в Power Shell.
Заранее премного благодарен за любую помощь.

Kazun 21-01-2013 09:14 2071460

(gc text.txt) -replace "\b4567#В4#5676\b","4567#БЫР4#5676"

Molchune 21-01-2013 09:35 2071474

А структура файла можно поподробней?
Код:

Get-Content c:\test\В34567.smt | ForEach-Object {$_ -replace '4567#В4#5676','4567#БЫР4#5676.'} | Set-Content c:\test\В34567.smt

Anderwood 21-01-2013 09:59 2071489

Касаемо структуры:

20#1#Е09-03-015-1#т#Монтаж прогонов =ДЕМОНТАЖ = Коз=0.0; Кэм=0.0; Кзм=0.0; Кмр=0#8648648#8646884#564.54#54665.45#####95.54#41.54#546.7#1546.48#5441.22#269.34#0#0#0##11.5451#1. 5445#2#10,7#0###1#0#0#
0#Коэффициент#Особые условия 2004 (СТР),Работы вне зданий#МДС 374.2004-567##:СТРПРЕТ;777*77;5.44*ЗМ;0.77*ЭМч;0.55*ТЗО;0.88*ТЗМ

и так далее.

В тексте может быть много разных:

20#1#Е09-03-015-5#п#
44#5#Е45-34-458-4#и#
56#2#Е96-47-325-2#а#

нужно заменить в таком файле все Е, например на НЕП.

20#1#НЕП09-03-015-5#п#
44#5#НЕП45-34-458-4#и#
56#2#НЕП96-47-325-2#а#

и соответственно:

20#1#НЕП09-03-015-1#т#Монтаж прогонов =ДЕМОНТАЖ = Коз=0.0; Кэм=0.0; Кзм=0.0; Кмр=0#8648648#8646884#564.54#54665.45#####95.54#41.54#546.7#1546.48#5441.22#269.34#0#0#0##11.5451#1. 5445#2#10,7#0###1#0#0#
0#Коэффициент#Особые условия 2004 (СТР),Работы вне зданий#МДС 374.2004-567##:СТРПРЕТ;777*77;5.44*ЗМ;0.77*ЭМч;0.55*ТЗО;0.88*ТЗМ

и так далее, естественно чтобы не получилось такого:

20#1#НЕП09-03-015-1#т#Монтаж прогонов =ДНЕПМОНТАЖ = Коз=0.0; Кэм=0.0; Кзм=0.0; Кмр=0#8648648#8646884#564.54#54665.45#####95.54#41.54#546.7#1546.48#5441.22#269.34#0#0#0##11.5451#1. 5445#2#10,7#0###1#0#0#
0#Коэффициент#Особые условия 2004 (СТР),Работы вне зданий#МДС 374.2004-567##:СТРПРЕТ;777*77;5.44*ЗМ;0.77*ЭМч;0.55*ТЗО;0.88*ТЗМ

Molchune 21-01-2013 17:55 2071814

А если вот так вот
Код:

$replace = Get-Content c:\test\В34567.smt  -Delimiter "#"
  foreach  ( $find in $replace) {
      if ($find -match "^Е[0123456789]" ) {
        $fraza = $find -replace 'Е','НЕП'
        $newreplace = Get-Content c:\test\В34567.smt  | ForEach-Object {$_ -replace $find , $fraza} | Set-Content c:\test\В34567.smt1 -Encoding utf8
      }
  }


Kazun 21-01-2013 18:17 2071832

(gc text.txt) -creplace "#Е","#НЕП"

Anderwood 23-01-2013 15:26 2073168

Большое спасибо!

rudimko 23-04-2013 11:17 2138126

Подскажите по замене, есть строки в файле, вот одна из них:
Apr 17 06:08:40 mail pop3d-ssl: LOGIN, user=username@domain.ru, ip=[::ffff:192.168.0.100], port=[56795]

Как произвести замену и оставить только "username@domain.ru"? Весь мозг сломал с -replace... Спасибо

Kazun 23-04-2013 11:24 2138132

Код:

PS> "Apr 17 06:08:40 mail pop3d-ssl: LOGIN, user=username@domain.ru, ip=[::ffff:192.168.0.100], port=[56795]" -replace ".+user=(.+), ip.+",'$1'
username@domain.ru


rudimko 23-04-2013 11:28 2138134

Kazun, Мерси...

Kazun 23-04-2013 12:18 2138183

$m | Select -Unique

4524 04-08-2020 17:03 2930141

Доброго дня.
Апну тему.
По вышеупомянутому образцу написал скрипт, но обновить действующий файл не получается - PS выдаёт, что файл "занят другим приложением".
При этом, если в скрипте название выходного файла другое, то он создаёт в этой же директории изменяемый файл.
В чём может быть ошибка?
Спасибо заранее.

Busla 04-08-2020 18:34 2930151

4524, это не ошибка - текстовые файлы не редактируются, а перезаписываются целиком либо только дописывают данные в конец. Либо через память, либо через временный файл.

Foreigner 04-08-2020 18:43 2930153

Цитата:

Цитата 4524
В чём может быть ошибка? »

Только можно догадываться. Схема такая:
Код:

(Get-Content file.txt) -replace 'регулярное_выражение','замена' | Set-Content file.txt

Uragan66 04-08-2020 19:25 2930158

Цитата:

Цитата 4524
PS выдаёт, что файл "занят другим приложением" »

При перезаписи файла по конвееру посредством Set-Content такая ошибка может быть.
Сохраняйте файл через Out-File:
Код:

(Get-Content file.txt) -replace 'регулярное_выражение','замена' | Out-File file.txt -Encoding utf8
Если с командлетом Set-Content, то так:
Код:

$i = (Get-Content file.txt) -replace 'регулярное_выражение','замена'
Set-Content file.txt -Encoding utf8 -Value $i


Foreigner 04-08-2020 20:24 2930162

Цитата:

Цитата Uragan66
При перезаписи файла по конвееру посредством Set-Content такая ошибка может быть. »

Ни разу не сталкивался. Приведите пример.

Uragan66 04-08-2020 21:26 2930164

Цитата:

Цитата Foreigner
Приведите пример »

Foreigner, так пример то выше, у 4524...
У меня при редактировании или создании плейлистов часто такая ошибка была при использовании Set-Content по конвееру. Сейчас просто нету свежего примера.

Foreigner 04-08-2020 23:22 2930168

Цитата:

Цитата Uragan66
так пример то выше, у 4524... »

У него нет никакого примера.

Цитата:

Цитата Uragan66
У меня при редактировании или создании плейлистов часто такая ошибка была при использовании Set-Content по конвееру. »

Get-Content в скобках позволяет полностью считать файл и открыть его на запись. Поэтому ошибка может быть только в том случае, если он занят каким-либо третьим процессом, из-за нехватки прав или в силу аттрибутов.

Iska 05-08-2020 08:42 2930186

Foreigner, там, выше, было и без скобок.

Foreigner 05-08-2020 08:45 2930187


Цитата:

Цитата Iska
Foreigner, там, выше, было и без скобок. »

Где, в 2013 году?

Iska 05-08-2020 09:40 2930192

Цитата:

Цитата Foreigner
Где, в 2013 году? »

Угу, где-то там.

Foreigner 05-08-2020 10:13 2930196

Iska, Раз 4524 не привел конкретно того, что у него не получилось, я предложил общую схему, которая у меня работает всегда. От нее и отталкиваюсь в дальнейшей дискуссии. А не от 2013 года

Busla 05-08-2020 10:51 2930200

Цитата:

Цитата Foreigner
я предложил общую схему, которая у меня работает всегда »

В реальной жизни текстовый файл - это огромный лог, дамп и т.п., который обрабатывается на месте. Поместиться в память он сможет, если выпрет из памяти полезную нагрузку.

Foreigner 05-08-2020 11:27 2930204


Цитата:

Цитата Busla
В реальной жизни текстовый файл - это огромный лог, дамп и т.п., »

Всему свое решение. В моей реальной жизни огромных файлов нет, я же не айтишник и никогда не был. Но если бы такое случилось, то я бы натравил [IO.FileStream] с соответствующими методами.


Т.е. это конкретика, а ее нет.


Время: 12:29.

Время: 12:29.
© OSzone.net 2001-