Questão Sed não substitui o texto corretamente


Eu estou tentando executar sed para substituir algum texto em um arquivo e eu dividi o texto distante, correu sed-lo individualmente para garantir que tudo é escapado corretamente e funciona. Quando eu coloco tudo de volta, isso não muda nada. Alguém pode me dizer o que estou fazendo errado?

Este é o comando que estou executando

sed -i -e 's/"php"   => \x27\x27,/"php"   => \x27\/opt\/remi\/php70\/root\/usr\/sbin\/php-fpm\x27,/g'

É suposto mudar

"php"   => '',

para

"php"   => '/opt/remi/php70/root/usr/sbin/php-fpm',

Achei que poderia ter algo a ver com o espaço em branco devido a como o código é recuado ou algo em que eu tentei algumas coisas, mas não estou chegando a lugar nenhum.

Está em um bloco que se parece com isso:

    $pathToExternals = array(
            "php"   => '',                  // Something like /usr/bin/php. If empty, will be found in PATH.
            "curl"  => '',                  // Something like /usr/bin/curl. If empty, will be found in PATH.
            "gzip"  => '',                  // Something like /usr/bin/gzip. If empty, will be found in PATH.
            "id"    => '',                  // Something like /usr/bin/id. If empty, will be found in PATH.
            "stat"  => '',                  // Something like /usr/bin/stat. If empty, will be found in PATH.
    );

Quaisquer ponteiros seriam muito apreciados!

obrigado


0


origem


Qual parte disso são os dados sendo processados? - Stephen Rauch
Desculpe, não tenho certeza do que você está perguntando, você pode, por favor, esclarecer? Tanto quanto eu sei, é simplesmente para substituir todas as instâncias do texto especificado para o que eu especificar, correto? - Zac1989
Sim, mas ao ler sua pergunta, não está claro o que você está processando. - Stephen Rauch
Estou processando a manipulação de texto com sed para alterar "php" => '', para "php" => '/opt/remi/php70/root/usr/sbin/php-fpm',  em um arquivo (config.php) eu simplesmente quero que o texto seja anexado e alterado para incluir o caminho do arquivo para php - Zac1989
Isso funciona para mim como é. Qual é a sua saída real e como ela varia do que você quer? - John1024


Respostas:


Parece que seu arquivo de origem pode ter algumas guias enquanto o comando sed assume apenas espaços em branco. Para fazer a substituição, independentemente de o espaço em branco consistir em espaços em branco ou tabulações, tente:

sed -i -e 's/"php"[[:space:]]*=>[[:space:]]*\x27\x27,/"php" => \x27\/opt\/remi\/php70\/root\/usr\/sbin\/php-fpm\x27,/g'

[[:space:]]* corresponde a zero ou mais de qualquer caractere de espaço em branco.

Como alhadis ressalta, podemos evitar a necessidade de escapar / se usarmos um delimitador diferente para o comando substituto. Por exemplo, podemos escolher |:

sed  -e 's|"php"[[:space:]]*=>[[:space:]]*\x27\x27,|"php"   => \x27/opt/remi/php70/root/usr/sbin/php-fpm\x27,|g'

1



Eu também recomendo usar um delimitador diferente ao combinar / inserir nomes de caminho, para evitar o desagradável \/learning\/toothpick\/syndrome. Por exemplo.,: s~match~/foo/bar/baz~g - Alhadis
Eu definitivamente vou olhar para isso, esse material regex é muito novo para mim, obrigado. - Zac1989
@ Zac1989 As primeiras seções desta página são uma excelente maneira de se aliviar no regex: grymoire.com/Unix/Sed.html - Alhadis
@Alhadis Boa sugestão. Eu adicionei a resposta. Além disso, Zac1989, eu segundo a recomendação do tutorial Grymoire. Os tutoriais do Grymoire podem ser um pouco desatualizados, mas fornecem uma boa introdução concisa. - John1024
@ John1024 Talvez recomendar [[:blank:]] ao invés de [[:space:]] se o espaço em branco horizontal (tabulação ou espaço) tiver que ser correspondido. Este último também incluirá form-feeds e newlines (eu sei sed processa registros linha por linha, mas tenho certeza de como isso é universal). De qualquer forma, vale a pena notar a diferença entre as duas classes. =) - Alhadis