PDA

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


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

Kazun
15-12-2014, 23:24
(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
"^.{8}(.{31}).{208}(.*)",'$1$2' »
Можно подробностей?
Как я понимаю
^ - начало строки
. - любой символ
{8} - до восьмого по счету, включительно или нет?
^.{8} - это $1?
(.{31}) - 31 любой символ пропустить?
.{208} - после 31-го символа любые символы до 208 (это получается $2?)
Почему получается 208? Это 8+31+208 это 247 откуда ещё единица?
Как получается $1$2 - это те символы что не попадают под выражение?
{$_.Substring(7,31) + $_.Substring(247)} »
Через Substring нужно выбирать только те символы что нужно оставить получается?

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

Kazun
16-12-2014, 12:30
.{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
Шаблон:
^.{8}(.{31}).{208}(.*)

«^»: привязка к началу строки; без этого поиск совпадений будет продолжен с любого символа.
«.{8}»: 8 любых символов.
«.{31}»: 31 любых символов.
«.{208}»: 208 любых символов.
«.*»: любое количество (в том числе и пустое) любых символов.

Скобки «(…)» группируют символы шаблона в подвыражения. В данном случае у нас два неименованных подвыражения, содержимое которых доступно в виде переменных «$1» и «$2».

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

naezd
16-12-2014, 13:10
в таком случае если у нас строка 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
$str.Substring(7,12)+$str.Substring(283,13)+$str.Substring(311,14)

naezd
16-12-2014, 13:39
в математике запутался
^.{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
$str -replace "^.{7}(.{12}).{264}(.{13}).{15}(.{14}).{148}$",'$1$2$3'

naezd
16-12-2014, 14:46
Странно, но -replace выводит тоже самое, что и изначально было в строке.

Iska
16-12-2014, 15:08
Странно, но -replace выводит тоже самое, что и изначально было в строке. »
Полагаю, Вы ошиблись с количеством символов в строке. Вы написали:
если у нас строка 473 символа »
и Вам привели шаблон на жёстко заданное количество — «"^…$"» без квантификаторов произвольного захвата (я не считал символы в шаблоне). Попробуйте ориентироваться, как в более раннем примере, не на точное количество, а на остаток символов — «.*» вместо «.{148}».

naezd
16-12-2014, 15:12
Да, вы как всегда правы. Спасибо большое!




© OSzone.net 2001-2012