“bad flag no comando substituto: '{” ao substituir uma string por sed de um arquivo para outro

1

Estou tentando substituir as 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 eu executo este comando

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

Eu recebo este erro

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

Há algo de errado com o meu regex?

O resultado que estou tentando conseguir é ter o File1 como:

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" />
    
por rbroadus 13.10.2014 / 12:52

3 respostas

3

Se você está tentando substituir em File1 tudo entre aspas duplas por novos nomes de imagens tiradas de File2 , então usaria 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" />
    
por 13.10.2014 / 15:08
1

Eu não tenho idéia do que você está tentando fazer lá, mas então meu sed-fu não é tão strong, então eu acho que você está usando alguma sintaxe arcana que eu não tenho conhecimento. Desde que eu não posso dizer o que está errado com seu sed (mas um palpite é que os caracteres especiais contidos em suas seqüências de substituição ( / , ? etc) estão causando problemas), eu vou oferecer 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. No one-liner acima, o -i faz 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;
}
    
por 13.10.2014 / 14:37
0

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 comando s do seguinte comando { . Equivalentemente, você pode colocá-los em argumentos -e separados.

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

Isso não vai fazer o que você quer, no entanto. 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 p sinalizador no comando s e o seguinte d ), e insere uma cópia de File1 para cada linha de entrada (correspondida ou não).

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

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

    
por 14.10.2014 / 02:49