Localize e substitua o grupo de captura dentro do arquivo

0

Estou tentando ler um arquivo de texto, não importa qual idioma ...

$x = [IO.File]::ReadAllText("__init__.py")

... encontre uma string

$pattern = [regex] '(?s)(?:ExportSTL.+?global_scale = .+?default=)(.+?),'

... e substitua o grupo de captura ( (.+?) ) por outra string (por exemplo, 10.0 ). Em seguida, escreva no arquivo e feche-o.

Como posso obter o grupo de captura de forma que eu possa modificá-lo e salvá-lo? Todas as minhas tentativas substituem toda a linha correspondente, com o grupo que não captura.

    
por Leeroy 13.08.2015 / 02:26

2 respostas

1

Experimente um grupo lookbehind positivo em vez do grupo sem captura:

$pattern = [regex] '(?s)(?<=ExportSTL.+?global_scale = .+?default=)(.+?),'

O grupo lookbehind precisará corresponder, mas não consumirá nenhum caractere.

A string de substituição será apenas '10.0' .

Uma maneira menos exótica seria transformar o grupo que não captura em um grupo normal:

$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'

A string de substituição seria '${1}10.0' (com aspas simples). O ${1} representa o primeiro grupo. (Você precisa das chaves ao redor do "1" para que ele não entre no "10.0").

    
por 13.08.2015 / 06:35
0

Solução

Graças a @dangph , aqui está o script com sua sugestão.

$x = [IO.File]::ReadAllText("__init__.py")
# Turned the non-capturing group into a normal group
$pattern = [regex] '(?s)(ExportSTL.+?global_scale = .+?default=)(.+?),'
# Put $1 in curly brackets, and added literal comma at end of replacement
$x -replace $pattern, '${1}10.0,' | Set-Content .\__init__.py

Regex101 atualizado

    
por 13.08.2015 / 15:53