AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 705818
Accepted
xpt
xpt
Asked: 2022-06-12 08:02:58 +0800 CST2022-06-12 08:02:58 +0800 CST 2022-06-12 08:02:58 +0800 CST

Substituição condicional usando perl

  • 772

Pergunta hipotética muito simples,

Cheguei à limitação sede preciso mudar meu sedscript para perl. Então, para sedsubstituiçã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
sed perl
  • 3 3 respostas
  • 285 Views

3 respostas

  • Voted
  1. meuh
    2022-06-12T09:55:10+08:002022-06-12T09:55:10+08:00

    O problema é que $1e assim por diante são redefinidos em cada nova expressão regular, então eles ficarão vazios a menos que você os repita no scomando, ou seja

    s/^([135])(.)$/$1.$2-/ if /^([135])(.)$/'
    

    que pode ser simplificado removendo o if:

    s/^([135])(.)$/$1.$2-/
    

    Em um caso mais geral, você pode preservar os valores capturados:

    if (/^([135])(.)$/) { $a=$1; $b=$2; s/$&/$a.$b-/; }
    
    • 6
  2. Best Answer
    Kusalananda
    2022-06-12T11:15:03+08:002022-06-12T11:15:03+08:00

    Se você pretende reduzir a digitação e aumentar a semelhança entre como fazer isso em Perl e sed. Nesse caso, ambos sede Perl permitem a reutilização da expressão regular correspondente mais recentemente, especificando uma expressão vazia.

    sed '/^\([135]\)\(.\)$/ s//\1.\2-/'
    
    perl -pe '/^([135])(.)$/ && s//$1.$2-/'
    

    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-circuito if. Em sed, a primeira expressão simplesmente atua como o endereço do comando de substituição.

    No geral,

    sed '/condition/ s/xx/yy/'
    

    ... seria "o mesmo que" (levando em consideração a sintaxe ligeiramente diferente e os sabores de expressão regular)

    perl -pe '/condition/ && s/xx/yy/'
    

    Nesse caso, porém, seria mais simples aplicar a substituição diretamente:

    sed 's/^\([135]\)\(.\)$/\1.\2-/'
    
    perl -pe 's/^([135])(.)$/$1.$2-/'
    
    • 6
  3. jubilatious1
    2022-07-12T14:03:29+08:002022-07-12T14:03:29+08:00

    Usando Raku (anteriormente conhecido como Perl_6)

    raku -pe 's/^ (<[135]>) (.) $/$0.$1-/;'  
    

    OU

    raku -pe 's/^ (.) (.) $/$0.$1-/ if  m/^ <[135]> /;'  
    
    #Immediately above being a re-arrangement of:
    
    raku -pe 'if m/^ <[135]> /  {s/^ (.) (.) $/$0.$1-/};' 
    

    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 uma ifcondicional, que alguns usuários podem achar mais legível).

    Entrada de amostra:

    11
    22
    33
    44
    55
    66
    

    Saída de amostra:

    1.1-
    22
    3.3-
    44
    5.5-
    66
    

    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:

    raku -pe 's/^ (<[135]>) $0 $/$0.$0-/;'  
    

    OU

    raku -pe 's{^ (<[135]>) $0 $} = "$0.$0-";'  
    

    OU (capturas nomeadas, abaixo):

    raku -pe 's/^ $<myOdd>=<[135]> $<myOdd> $/$<myOdd>.$<myOdd>-/;' 
    

    OU

    raku -pe 's{^ $<myOdd>=<[135]> $<myOdd> $} = "$<myOdd>.$<myOdd>-";'  
    

    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, ifetc. 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

    • 1

relate perguntas

  • Linux grep o que no arquivo 1 está no arquivo 2 [duplicado]

  • como grep linhas após a terceira vírgula com condição

  • remova o número de linhas duplicadas com base na correspondência antes da primeira vírgula

  • Como posso melhorar este script de conversão de personagens?

  • Como remover uma única linha entre duas linhas

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve