Показать полную графическую версию : [решено] Маскирование многострочного текстового файла
Привет.
Есть некий тескстовый файл с неопределенным количеством одинаковых по длине строк. Задача, удалить (или заменить на ***) из каждой строки любые символы с 1 по 8 потом 40 по 248 и т.д. Как бы так регексп написать в реплейсе чтобы любые символы менял именно в нужном месте.
Спасибо за помощь, ногами не бить в регекспах дуб дубом...
(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
"^.{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 нужно выбирать только те символы что нужно оставить получается?
Извиняюсь за занудство, но хочется разобраться чтобы в будущем понимать что к чему.
Спасибо.
.{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
Шаблон:
^.{8}(.{31}).{208}(.*)
«^»: привязка к началу строки; без этого поиск совпадений будет продолжен с любого символа.
«.{8}»: 8 любых символов.
«.{31}»: 31 любых символов.
«.{208}»: 208 любых символов.
«.*»: любое количество (в том числе и пустое) любых символов.
Скобки «(…)» группируют символы шаблона в подвыражения. В данном случае у нас два неименованных подвыражения, содержимое которых доступно в виде переменных «$1» и «$2».
Примерная строка:
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 … всего 208 символов…0123456789012345
Поскольку квантификатор «*» — «жадный», выражение «.*» из п.5 захватит все оставшиеся символы до конца строки.
в таком случае если у нас строка 473 символа, а нам нужно удалить значения с 1 по 7, с 20 по 283, с 297 по 311, с 326 по 473.
то будет ^.{7}(.{13}).{283}(.{14}).{311}(.{15}).473?, $1$2$3
или я со скобками напортачил?
$str.Substring(7,12)+$str.Substring(283,13)+$str.Substring(311,14)
в математике запутался
^.{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 }
оно?
$str -replace "^.{7}(.{12}).{264}(.{13}).{15}(.{14}).{148}$",'$1$2$3'
Странно, но -replace выводит тоже самое, что и изначально было в строке.
Странно, но -replace выводит тоже самое, что и изначально было в строке. »
Полагаю, Вы ошиблись с количеством символов в строке. Вы написали:
если у нас строка 473 символа »
и Вам привели шаблон на жёстко заданное количество — «"^…$"» без квантификаторов произвольного захвата (я не считал символы в шаблоне). Попробуйте ориентироваться, как в более раннем примере, не на точное количество, а на остаток символов — «.*» вместо «.{148}».
Да, вы как всегда правы. Спасибо большое!
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.