Comando sed com apóstrofo

2
sed -e 's/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/'

Eu tenho esta mensagem de erro:

  sed: -e expression, char 20: unterminated 's' command

Por favor, como posso corrigir o comando sed?

    
por researcher 24.07.2015 / 13:04

2 respostas

7
$ sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/"

ou

sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'Test' 'Cluster1\'/

O único com todas as citações simples foi mais difícil de construir sem este programa para ajudar, Se você quiser alguma ajuda para obter o comando correto, existe um programa C que você pode usar

$ cat w.c
#include <stdio.h>

int main(int argc, char *argv[]) {
        int i = 0;
        while (argv[i]) {
                printf("argv[%d] = %s\n", i, argv[i]);
                i++;
        }
        return 0;
}

Estou testando a partir do cygwin, mas qualquer shell * nix deve ser o mesmo

Você vê isso funciona

$ ./w sed -e "s/cluster_name: 'Test Cluster'/cluster_name: 'Test Clust
er1'/"
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/


$

Considerando que se você tentar o de suspectus

sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test Cluster1\'/'

Você pode usar o programa para encontrar a falha nele

O seu nem sequer executa

$ ./w  sed -e 's/cluster_name: \'Test Cluster\'/cluster_name: \'Test C
luster1\'/'
>CTRL-C

Porque tem uma citação simples em falta

$ ./w 'fgg
>

entre talvez outros problemas.

E se você olhar para o suspeito, ele falha mesmo perto do começo, ele quebra no espaço

$ ./w  sed -e 's/cluster_name: \'Test Clu
argv[0] = f:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: \Test
argv[4] = Clu

Este aqui funciona

$ ./w  sed -e 's/cluster_name: '\''Test Cluster'\'\/cluster_name:' '\'
Test' 'Cluster1\'/
argv[0] = F:\blah\w.exe
argv[1] = sed
argv[2] = -e
argv[3] = s/cluster_name: 'Test Cluster'/cluster_name: 'Test Cluster1'/

Ao colocá-lo junto, você pode tentar adicionar um espaço e um caractere e, em seguida, ver se o modo de cotação está ativado ou desativado. Se estiver desligado, se você quiser escapar de uma cota única, use \ 'Se estiver ligado e desligue-o com' e '\ Se você perder a faixa se estiver ligado ou desligado, adicione um espaço, veja se ele cria um novo parâmetro ou não.

    
por 24.07.2015 / 13:25
2

Você precisaria escapar das aspas simples no comando sed s :

sed -e 's/cluster_name: '\''Test Cluster'\''/cluster_name: '\''Test Cluster1'\''/'

Editar aspas simples costuma ser complicado. Onde quer que haja uma única citação na string que você substitui com '\'' , tentarei explicar como isso funciona - sinta-se à vontade para melhorar isso!

'\'' - a primeira citação termina com sed string e o que segue é analisado pelo shell. A barra invertida renderiza o caractere que segue como um caractere simples (e não um meta-caractere). A citação final termina a seção interpretada e o que segue é analisado por sed .

    
por 24.07.2015 / 13:15

Tags