Pergunta hipotética muito simples,
Cheguei à limitação sed
e preciso mudar meu sed
script para perl
. Então, para sed
substituição condicional de
sed '/condition/ s/xx/yy/'
Como fazer isso em perl?
Por exemplo, como fazer o seguinte em perl?
seq 6 > /tmp/tf
$ paste -d '' /tmp/tf /tmp/tf | sed -E '/[135]/s/^(.)(.)$/\1.\2-/'
1.1-
22
3.3-
44
5.5-
66
$ paste -d '' /tmp/tf /tmp/tf | perl -pe 's/$&/$1.$2-/ if /^([135])(.)$/'
.-
22
.-
44
.-
66
O problema é que
$1
e assim por diante são redefinidos em cada nova expressão regular, então eles ficarão vazios a menos que você os repita nos
comando, ou sejaque pode ser simplificado removendo o
if
:Em um caso mais geral, você pode preservar os valores capturados:
Se você pretende reduzir a digitação e aumentar a semelhança entre como fazer isso em Perl e
sed
. Nesse caso, ambossed
e Perl permitem a reutilização da expressão regular correspondente mais recentemente, especificando uma expressão vazia.A expressão regular vazia no
s///
comando reutilizará a expressão do teste anterior (em geral, a expressão correspondente mais recente).Em Perl, devemos adicionar
&&
entre o teste e a substituição para deixá-lo agir como uma instrução de curto-circuitoif
. Emsed
, a primeira expressão simplesmente atua como o endereço do comando de substituição.No geral,
... seria "o mesmo que" (levando em consideração a sintaxe ligeiramente diferente e os sabores de expressão regular)
Nesse caso, porém, seria mais simples aplicar a substituição diretamente:
Usando Raku (anteriormente conhecido como Perl_6)
OU
Postando isso na esperança de que seja útil para usuários de Perl que se interessam pelo Raku. No Raku, a captura começa a partir de
$0
, e as classes de caracteres são criadas com marcadores<[
…]>
(somente colchetes são reservados para agrupamento). Também a correspondência é geralmente insensÃvel ao espaço em branco (ou seja, Perl5\x
é o padrão).Tentar o primeiro exemplo de código Perl5 do @Kusalananda (com um 'acento' Raku conforme descrito) produzirá o erro Raku
Null regex not allowed
. Portanto, a primeira resposta do Raku acima se parece muito mais com o último exemplo de código Perl5 do @Kusalananda. (A segunda resposta do Raku acima utiliza umaif
condicional, que alguns usuários podem achar mais legÃvel).Entrada de amostra:
SaÃda de amostra:
ADENDO: Como o OP postou dados de amostra que concatenavam dÃgitos idênticos - estou me perguntando se ainda há uma pergunta não respondida aqui sobre referências anteriores . No Raku, se você quiser reutilizar a primeira captura dentro de uma partida (por exemplo, lado esquerdo do
s///
operador), faça o seguinte:OU
OU (capturas nomeadas, abaixo):
OU
O segundo e quarto exemplos imediatamente acima usam a nova notação de "atribuição de substituição" do Raku, que (para melhorar a legibilidade) também permite vários delimitadores - colchetes, curvas,
if
etc. seção, mas isso pode resultar em código menos legÃvel).https://raku.org/archive/rfc/144.html
https://raku.org/archive/rfc/331.html
https://raku.org