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

naezd 15-12-2014 23:06 2444441

Маскирование многострочного текстового файла
 
Привет.
Есть некий тескстовый файл с неопределенным количеством одинаковых по длине строк. Задача, удалить (или заменить на ***) из каждой строки любые символы с 1 по 8 потом 40 по 248 и т.д. Как бы так регексп написать в реплейсе чтобы любые символы менял именно в нужном месте.
Спасибо за помощь, ногами не бить в регекспах дуб дубом...

Kazun 15-12-2014 23:24 2444448

Код:

(Get-Content file.txt) | Foreach {$_ -replace "^.{8}(.{31}).{208}(.*)",'$1$2'} | Out-File result.txt
или Substring:

Код:

Get-Content file.txt | Foreach {$_.Substring(7,31) + $_.Substring(247)} | Out-File result.txt

naezd 16-12-2014 12:22 2444552

Цитата:

Цитата Kazun
"^.{8}(.{31}).{208}(.*)",'$1$2' »

Можно подробностей?
Как я понимаю
^ - начало строки
. - любой символ
{8} - до восьмого по счету, включительно или нет?
^.{8} - это $1?
(.{31}) - 31 любой символ пропустить?
.{208} - после 31-го символа любые символы до 208 (это получается $2?)
Почему получается 208? Это 8+31+208 это 247 откуда ещё единица?
Как получается $1$2 - это те символы что не попадают под выражение?
Цитата:

Цитата Kazun
{$_.Substring(7,31) + $_.Substring(247)} »

Через Substring нужно выбирать только те символы что нужно оставить получается?

Извиняюсь за занудство, но хочется разобраться чтобы в будущем понимать что к чему.
Спасибо.

Kazun 16-12-2014 12:30 2444559

.{8} - ровно 8

Код:

PS > "aaaaaa" -replace ".{8}"
aaaaaa
PS > "aaaaaaaa" -replace ".{8}"

^.{8} - это $1? - нет
(.{31}) - это $1 (символы с 9 по 39)

.{208} - ровно 208
(.*) - $2 (оставшиеся символы c 249)

248 - 40 = 208

Как получается $1$2 - это те символы что не попадают под выражение? - Все символы подпадают по выражение, но надо оставить символы,кроме с 1 по 8 потом 40 по 248

Iska 16-12-2014 13:01 2444577

Шаблон:
Код:

^.{8}(.{31}).{208}(.*)
  1. «^»: привязка к началу строки; без этого поиск совпадений будет продолжен с любого символа.
  2. «.{8}»: 8 любых символов.
  3. «.{31}»: 31 любых символов.
  4. «.{208}»: 208 любых символов.
  5. «.*»: любое количество (в том числе и пустое) любых символов.
Скобки «(…)» группируют символы шаблона в подвыражения. В данном случае у нас два неименованных подвыражения, содержимое которых доступно в виде переменных «$1» и «$2».

Примерная строка:
Код:

0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789… всего 208 символов…0123456789012345
Поскольку квантификатор «*» — «жадный», выражение «.*» из п.5 захватит все оставшиеся символы до конца строки.

naezd 16-12-2014 13:10 2444583

в таком случае если у нас строка 473 символа, а нам нужно удалить значения с 1 по 7, с 20 по 283, с 297 по 311, с 326 по 473.
то будет ^.{7}(.{13}).{283}(.{14}).{311}(.{15}).473?, $1$2$3
или я со скобками напортачил?

Kazun 16-12-2014 13:20 2444584

Код:

$str.Substring(7,12)+$str.Substring(283,13)+$str.Substring(311,14)

naezd 16-12-2014 13:39 2444590

в математике запутался
^.{7}(.{12}).{283}(.{13}).{311}(.{14}).473?, $1$2$3
Код:

$file = Get-Content "C:\Scripts\file.txt"
$regexp = "^.{7}(.{12}).{283}(.{13}).{311}(.{14}).473?"
$replace = '$1$2$3'
 foreach ($line in $file) { $line -replace $regexp,$replace }

оно?

Kazun 16-12-2014 14:00 2444596

Код:

$str -replace "^.{7}(.{12}).{264}(.{13}).{15}(.{14}).{148}$",'$1$2$3'

naezd 16-12-2014 14:46 2444621

Странно, но -replace выводит тоже самое, что и изначально было в строке.

Iska 16-12-2014 15:08 2444636

Цитата:

Цитата naezd
Странно, но -replace выводит тоже самое, что и изначально было в строке. »

Полагаю, Вы ошиблись с количеством символов в строке. Вы написали:
Цитата:

Цитата naezd
если у нас строка 473 символа »

и Вам привели шаблон на жёстко заданное количество — «"^…$"» без квантификаторов произвольного захвата (я не считал символы в шаблоне). Попробуйте ориентироваться, как в более раннем примере, не на точное количество, а на остаток символов — «.*» вместо «.{148}».

naezd 16-12-2014 15:12 2444638

Да, вы как всегда правы. Спасибо большое!


Время: 09:55.

Время: 09:55.
© OSzone.net 2001-