"sinalizador incorreto no comando substituto: '{" ao substituir uma string por sed de um arquivo para outro arquivo

"sinalizador incorreto no comando substituto: '{" ao substituir uma string por sed de um arquivo para outro arquivo

Estou tentando substituir strings encontradas no Arquivo1 por strings no Arquivo2

Arquivo1

<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2011/03/27&amp;EntityID=Ad12911&amp;imgExtension=" />
<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2011/03/20&amp;EntityID=Ad13304&amp;imgExtension=" />
<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2010/08/29&amp;EntityID=Ad13724&amp;imgExtension=" />

Arquivo2

/getimage.dll?path=Orange/2011/03/27/129/Img/Ad1291103.gif
/getimage.dll?path=Orange/2011/03/20/133/Img/Ad1330402.gif
/getimage.dll?path=Orange/2010/08/29/137/Img/Ad1372408.gif

Quando executo este comando

$ sed -e 's/.*SRC="\/Repository\([^"]*\)".*/\1/p{r File1' -e 'd}' File2

Eu recebo esse erro

sed: 1: "s/.*SRC="\/Repository\( ...": bad flag in substitute command: '{'

Há algo errado com meu regex?

O resultado que estou tentando alcançar seria fazer com que o Arquivo1 se parecesse com:

Arquivo1

<IMG SRC="/Repository/getimage.dll?path=Orange/2011/03/27/129/Img/Ad1291103.gif" />
<IMG SRC="/Repository/getimage.dll?path=Orange/2011/03/20/133/Img/Ad1330402.gif" />
<IMG SRC="/Repository/getimage.dll?path=Orange/2010/08/29/137/Img/Ad1372408.gif" />

Responder1

Se você estiver tentando substituir File1tudo entre aspas duplas por novos nomes de imagens retirados File2, eu usaria o awk:

awk -F'"' 'NR==FNR{a[i++]=$1;next}{print $1 FS a[j++] FS $3}' File2 File1

A saída é a seguinte:

<IMG SRC="/getimage.dll?path=Orange/2011/03/27/129/Img/Ad1291103.gif" />
<IMG SRC="/getimage.dll?path=Orange/2011/03/20/133/Img/Ad1330402.gif" />
<IMG SRC="/getimage.dll?path=Orange/2010/08/29/137/Img/Ad1372408.gif" />

Responder2

Não tenho ideia do que você está tentando fazer aí, mas meu sed-fu não é tão forte, então acho que você está usando alguma sintaxe misteriosa que não conheço. Como não posso dizer o que há de errado com o seu sed (mas um palpite é que os caracteres especiais contidos nas suas strings de substituição ( /, ?etc) estão causando problemas), em vez disso, oferecerei uma alternativa Perl:

perl -i -pe 'BEGIN{open($f,shift); while(<$f>){chomp; push @F,$_}}
            $k=shift(@F); s/(.*SRC=.)([^"]*)/$1$k/' file2 file1 

Aqui está a mesma coisa escrita como um script comentado para torná-lo mais claro. Na linha acima, -ifaz com que o arquivo de entrada real seja alterado, assim como sed -i.

#!/usr/bin/env perl

## This is the equivalent of the BEGIN{} block.
## @ARGV is the array of arguments and shift returns
## the first element of it. This is file2 which is
## then opened, each line is read, its trailing \n
## is removed by chomp and it is then added to the @F array.
my $file=shift(@ARGV);
open($f,$file);
while(<$f>){chomp; push @F,$_}

## This is the rest of the oneliner above. The -pe options
## cause the file to be read and each line printed after 
## the script is applied. Since the previous block removed 
## file2 from @ARGV, this is applied to file1 only.
while (<>) {
    ## Remove the 1st item of @F. This is a line of file2.
    $k=shift(@F);

    ## Make the substitution. The \ before the " is not 
    ## needed, I just added it here because otherwise, the 
    ## syntax highlighting is broken. 
    s/(.*SRC=.)([^\"]*)/$1$k/;
    ## This print is implied by the -p flag
    print;
}

Responder3

O erro está dizendo que seu comando sed está errado, não seu regexp. Você precisa de uma nova linha ou ponto e vírgula para separar o scomando do {comando a seguir. De forma equivalente, você pode colocá-los em -eargumentos separados.

sed -e 's/.SRC="/Repositório([^"])".*/\1/p' -e '{' -e 'r Arquivo1' -e 'd' -e '}' Arquivo2

Isso não fará o que você deseja, no entanto. Ele remove o prefixo …SRC="Repository/e a parte que começa nas próximas aspas duplas da entrada, imprimindo apenas as linhas que foram substituídas (por causa do psinalizador no scomando e o seguinte d) e insere uma cópia de File1para cada linha de entrada (correspondente ou não).

Se quiser combinar os dados dos dois arquivos, você precisará de uma ferramenta mais poderosa que o sed¹.EstranhoouPerlsão boas escolhas.

¹ Tecnicamente, sed é Turing completo, mas fazer isso em sed seria extremamente complexo e obscuro.

informação relacionada