"bandera incorrecta en el comando sustituto: '{" mientras se reemplaza una cadena con sed de un archivo a otro

"bandera incorrecta en el comando sustituto: '{" mientras se reemplaza una cadena con sed de un archivo a otro

Estoy intentando reemplazar cadenas encontradas en Archivo1 con cadenas en Archivo2

Archivo1

<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=" />

Archivo2

/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

Cuando ejecuto este comando

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

me sale este error

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

¿Hay algún problema con mi expresión regular?

El resultado que intento lograr sería que el Archivo1 se viera así:

Archivo1

<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" />

Respuesta1

Si está intentando reemplazar File1todo lo que está dentro de comillas dobles con nuevos nombres de imágenes tomados, File2entonces usaría awk:

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

El resultado es el siguiente:

<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" />

Respuesta2

No tengo idea de lo que estás tratando de hacer allí, pero mi sed-fu no es tan fuerte, así que supongo que estás usando alguna sintaxis arcana que desconozco. Como no puedo decirle qué está mal con su sed (pero una suposición fundamentada es que los caracteres especiales contenidos en sus cadenas de reemplazo ( /, ?etc.) están causando problemas), en su lugar ofreceré una alternativa a Perl:

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

Aquí está lo mismo escrito como un guión comentado para que quede más claro. En la frase anterior, -ihace que se cambie el archivo de entrada real, al igual que 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;
}

Respuesta3

El error le indica que su comando sed es incorrecto, no su expresión regular. Necesita una nueva línea o un punto y coma para separar el scomando del siguiente {comando. De manera equivalente, puedes ponerlos en -eargumentos separados.

sed -e's/.SRC="/Repositorio([^"])".*/\1/p' -e '{' -e 'r Archivo1' -e 'd' -e '}' Archivo2

Sin embargo, esto no hará lo que quieres. Elimina el prefijo …SRC="Repository/y la parte que comienza en la siguiente comilla doble de la entrada, imprimiendo solo las líneas que han sido reemplazadas (debido a la pbandera en el scomando y lo siguiente d), e inserta una copia de File1para cada línea de entrada (coincidente O no).

Si desea hacer coincidir los datos de los dos archivos, necesitará una herramienta más poderosa que sed¹.awkoperlason buenas opciones.

¹ Técnicamente, sed es Turing completo, pero hacerlo en sed sería extremadamente complejo y oscuro.

información relacionada