Estoy intentando reemplazar cadenas encontradas en Archivo1 con cadenas en Archivo2
Archivo1
<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2011/03/27&EntityID=Ad12911&imgExtension=" />
<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2011/03/20&EntityID=Ad13304&imgExtension=" />
<IMG SRC="/Repository/GetImage.dll?baseHref=Orange/2010/08/29&EntityID=Ad13724&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 File1
todo lo que está dentro de comillas dobles con nuevos nombres de imágenes tomados, File2
entonces 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, -i
hace 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 s
comando del siguiente {
comando. De manera equivalente, puedes ponerlos en -e
argumentos 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 p
bandera en el s
comando y lo siguiente d
), e inserta una copia de File1
para 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.