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 / 537753
Accepted
schrodingerscatcuriosity
schrodingerscatcuriosity
Asked: 2019-08-28 13:52:58 +0800 CST2019-08-28 13:52:58 +0800 CST 2019-08-28 13:52:58 +0800 CST

Bash sed substitui o sinal de dólar duplo $$ expressões regulares estendidas

  • 772

Este comando:

echo '$$foo=bar' | sed -E "s/(\$\$foo=).*/\1$(echo hello)/"

saídas:

$$foo=bar

Se eu alterar as sedaspas para simples e colocar o comando entre aspas duplas:

echo '$$foo=bar' | sed -E 's/(\$\$foo=).*/\1'"$(echo hello)"'/'

ele produz o resultado desejado:

$$foo=hello

Então eu acho que o problema está nas expressões regulares estendidas e aspas, a menos que eu esteja perdendo algo óbvio.

  1. A concatenação de aspas simples e duplas na sedsubstituição de comandos é uma boa prática ( sed 's/foo/'"$(command)"'/')?

  2. Como posso escapar de cifrões duplos sedcom expressões regulares estendidas?

regular-expression sed
  • 1 1 respostas
  • 4675 Views

1 respostas

  • Voted
  1. Best Answer
    Kusalananda
    2019-08-28T14:34:39+08:002019-08-28T14:34:39+08:00

    POSIX tem a dizer sobre a diferença em como $é interpretado em expressões regulares básicas e estendidas:

    Expressões regulares básicas (BREs):

    Um <dollar-sign>( $) deve ser uma âncora quando usado como o último caractere de um BRE inteiro. A implementação pode tratar a <dollar-sign>como uma âncora quando usada como o último caractere de uma subexpressão. O <dollar-sign>deve ancorar a expressão (ou opcionalmente subexpressão) no final da string que está sendo correspondida; pode - <dollar-sign>se dizer que corresponde ao final da string após o último caractere.

    Expressões regulares estendidas (EREs):

    Um <dollar-sign>( $) fora de uma expressão entre colchetes deve ancorar a expressão ou subexpressão que termina no final de uma string; tal expressão ou subexpressão pode corresponder apenas a uma sequência que termina no último caractere de uma string. Por exemplo, os EREs ef$e (ef$)correspondem efna string abcdef, mas não correspondem na string cdefab, e o ERE e$fé válido, mas nunca pode corresponder porque fimpede que a expressão e$corresponda ao último caractere.

    Conclusão: Em um BRE, o $caractere corresponde a si mesmo, a menos que seja o último caractere da expressão ou subexpressão (nesse caso, ancora a (sub)expressão no final da linha). Em um ERE, o $personagem sempre ancora no final da linha.

    Quando você usa

    sed -E "s/(\$\$foo=).*/\1$(echo hello)/"
    

    seu ERE (desde que você usa -E) é ($$foo=).*e essa expressão nunca corresponderá (o texto POSIX acima contém o exemplo e$fque é semelhante).

    Seu comando

    sed "s/\$\$foo/\$\$hello/"
    

    usa o BRE $$fooque corresponderá à string literal, $$foopois os $caracteres não estão no final da expressão.

    Para corresponder a um único $caractere em uma expressão regular estendida, use \$ou [$]. Para escapar disso para o shell em uma string com aspas duplas, use \\\$(uma barra invertida de escape seguida por um cifrão de escape) ou [\$], ou seja,

    sed -E "s/(\\\$\\\$foo=).*/\1$(echo hello)/"
    

    ou

    sed -E "s/([\$][\$]foo=).*/\1$(echo hello)/"
    

    (A barra invertida em \1não precisa de escape, pois as barras invertidas só agem como um caractere de escape em uma string com aspas duplas se seguidas por um cifrão, backtick, aspas duplas, outra barra invertida ou uma nova linha; portanto, é literal, não uma referência\1 de escape 1; aqui ).

    Respostas curtas:

    1. Você pode colocar aspas simples nos bits que precisam de aspas simples (e concatenar isso com uma string entre aspas duplas contendo suas expansões de shell), ou você escapa o que precisa ser escapado em uma única string com aspas duplas. Isso é uma questão de gosto. Eu estaria mais preocupado em usar uma substituição de comando na expressão, pois essa é uma vulnerabilidade de injeção de código, a menos que você tenha controle total sobre a string inserida.

    2. \\\$ou [\$]em uma string com aspas duplas. \$ou [$]em uma única string entre aspas.

    • 4

relate perguntas

  • 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

  • menos: várias condições de filtro com AND

  • 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