![]() |
Поиск и замена
Добрый день.
Имеется тектовый файл, размером более 5000 строк. Вида: pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26916,1000,3750,'','','11',null,NULL,1) pla (IdPl,EncLevel,IdSection) Values (26916,2,21) pla(IdPl,EncLevel,IdSection) Values (26916,1,1065) Pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26917,2900,3750,'','','11',null,NULL,1) Pla(IdPl,EncLevel,IdSection) Values (26917,2,21) Pla (IdPl,EncLevel,IdSection) Values (26917,1,1065) Pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26918,1050,3750,'','','11',null,NULL,1) Pla (IdPl,EncLevel,IdSection) Values (26918,2,21) Pla (IdPl,EncLevel,IdSection) Values (26918,1,1065) Pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26919,1100,3750,'','','11',null,NULL,1) Pla (IdPl,EncLevel,IdSection) Values (26919,2,21) Pla (IdPl,EncLevel,IdSection) Values (26919,1,1065) Задача состоит в том, что-бы заменить все Выделенные жирным цветом значения(они меняются +1 каждую четвертую строчку), на отрицательные цифры по порядку: 26916 == -1 , 26917 == -2 , 26918 == -3 ... |
user689, уважаемый, Вы в своем уме? Обрабатывать файл в пять тысяч строк на командном языке - что-то из разряда утонченного извращения. PowerShell'то достаточно долго думал, к слову, решение на нем будет выглядеть примерно так:
Код:
gc file | % {$a=-1;$b=0}{$_ -replace '(\d{5})', $a;$b++;if($b -eq 4){$b=0;$a+=-1}} Код:
perl -pe 's/(\d{5})/-($1-26915)/e' file |
На PowerShell можно еще так:
Код:
$a=0; (gc file.txt -read 4) | foreach { $_ -replace '\d{5}', --$a } | sc file.txt |
Foreigner, тогда уж лучше:
Код:
gc file -r 4|%{$a=0}{$_ -replace '\d{5}', --$a} |
Цитата:
|
В принципе, если гибридить JScript с командным языком, то:
Код:
0</* : gawk при замерах также показывает неплохой результат. Код:
gawk 'match($0,/(.*\()([0-9]{5})(,.*)/,a) {$0=a[1]"-"a[2]-26915a[3]} 1' file |
Спасибо за ответы!
PowerShell справился с задачей. А как быть если в тексте встречаются дополнительные строки, количество их может быть разное, например: pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26916,1000,3750,'','','11',null,NULL,1) pla (IdPl,EncLevel,IdSection) Values (26916,2,21) pla(IdPl,EncLevel,IdSection) Values (26916,1,1065) go Pl (IdPl,X,Y,TitleLine,Name,Description,idRowMetric,idPlMetric,Person) Values (26917,2900,3750,'','','11',null,NULL,1) Pla(IdPl,EncLevel,IdSection) Values (26917,2,21) Pla (IdPl,EncLevel,IdSection) Values (26917,1,1065) commit go ... ... ... Однако перед каждым заменяемым значением всегда присутствуют "Values (" |
Цитата:
|
Вложений: 1
Пример файла во вложении.
Файл 135122 |
user689, Попробуйте такой вариант:
Код:
$a = sls '\d{5}' ttv.txt |
PS C:\Documents and Settings\Администратор> $a.matches.value[0]..$a.matches.value[-1] | foreach { $n=0 } { $b = $b -repl
ace $_, --$n } Не удается индексировать в массив NULL. строка:1 знак:18 + $a.matches.value[ <<<< 0]..$a.matches.value[-1] | foreach { $n=0 } { $b = $b -replace $_, --$n } + CategoryInfo : InvalidOperation: (0:Int32) [], RuntimeException + FullyQualifiedErrorId : NullArray |
|
на сервере версия 2.0 - не сработало, в 4.0 - все хорошо.
Спасибо! |
Время: 04:08. |
Время: 04:08.
© OSzone.net 2001-