Estou tentando usar alguma aritmética sobre os padrões correspondentes na perl
linha de comando. Eu sou capaz de fazer isso para uma partida, mas não para todas.
str="a1b2c3"
perl -pe 's/\d+/$&+1/e' <<<"$str"
a2b2c3
Entendo que $&
se refere ao primeiro dígito correspondente 1
aqui. O que eu preciso fazer para adicionar 1
a todos os dígitos? Existe uma variável semelhante a $&
que representa todos os padrões correspondentes? ou o regex precisa ser modificado para corresponder a vários dígitos.
Para a entrada fornecida, estou esperando uma saída como
a2b3c4
O
g
sinalizador para a substituição faria o Perl aplicar a expressão para cada correspondência não sobreposta na linha de entrada.Nitpick: Na verdade, não há grupos de captura envolvidos aqui ( a pergunta original mencionava grupos de captura ). A variável Perl
$&
é a "string correspondente à última correspondência de padrão bem-sucedida". Isso é diferente de, por exemplo$1
, e$2
etc. que se referem à string correspondente ao grupo de captura correspondente (expressão entre parênteses). Não há grupos de captura em\d+
, mas você poderia ter usados/(\d+)/$1+1/ge
, que usa um único grupo de captura.Não há diferença entre
s/(\d+)/$1+1/ge
es/\d+/$&+1/ge
em termos de resultado. Neste curto script Perl em linha, não faz diferença se você escolhe usar um ou outro, mas geralmente você gostaria de evitar o uso$&
em programas Perl mais longos que fazem muitas operações de expressão regular, pelo menos se estiver usando um Perl mais antigo liberar.De
perldoc perlvar
(minha ênfase):Caso você esteja realmente usando o
zsh
shell (<<<
é um operador não padrão que vem dezsh
, mas foi copiado para alguns outros shells desde então), observe que você não precisa invocarperl
para isso.Você pode fazer:
Onde
(#m)
ativa a captura de toda a partida em$MATCH
(o equivalente aperl
's$&
)<->
corresponde a qualquer sequência de dígitos decimais (é como,<5-12>
mas sem qualquer limite).