2012-05-14 14 views
6

quiero reemplazar una sola línea en un archivo con varias líneas, por ejemploreemplazar una línea con múltiples líneas en un archivo

quiero reemplazar una llamada a una función particular, dicen
foo(1,2)

con

if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 

¿Cómo puedo hacerlo en bash?

+0

lo que si quiero cambiarlo actualización in situ en mi archivo actual sin crear ningún archivo extra. – ravi

+0

@ravi Ver mis ediciones. –

Respuesta

6

Esto es lo que el s comando sed fue construido para:

shopt -s extglob 

ORIG="foo(1,2)" 
REP="if (a > 1) { 
     foo(1,2) 
} else { 
     bar(1,2) 
}" 

REP="${REP//+(
)/\\n}" 

sed "s/$ORIG/$REP/g" inputfile > outputfile 

Tenga en cuenta que los REP="${REP//\+( )/\\n}" líneas sólo son necesarios si se quiere definir la REP en la forma formateada que hice en la línea dos . Puede ser más simple si acaba de usar \n y \t en REP para comenzar.

Editar en respuesta a la pregunta del OP

Para cambiar el archivo original sin crear un nuevo archivo, el uso de sed --in-place bandera, de este modo:

sed --in-place "s/$ORIG/$REP/g" inputfile 

Por favor, tenga cuidado con el --in-place bandera. Haga copias de seguridad antes de ejecutarlo porque todos los cambios serán permanentes.

+1

'shopt -s extglob' es obligatorio y la barra invertida antes del signo más debe eliminarse. –

+0

@DennisWilliamson Gracias por capturar eso. A veces olvido que la mayoría de las personas no tienen activadas las funciones de globbing extendido por defecto. La barra diagonal fue solo un residuo de las pruebas. –

+0

Está funcionando, pero no estoy seguro de lo que esto significa 'REP =" $ {REP // + ( )/\\ n} "' – ravi

1
ORIGINAL="foo(1,2)" 
REPLACEMENT="if (a > 1) { 
foo(1,2) 
} else { 
bar(1,2) 
}" 

while read line; do 
    if [ "$line" = "$ORIGINAL" ]; then 
    echo "$REPLACEMENT" 
    else 
    echo "$line" 
    fi 
done </path/to/your/file> /path/to/output/file 
0

Esto podría funcionar para usted:

cat <<\! | 
> a 
> foo(1,2) 
> b 
> foo(1,2) 
> c 
> ! 
> sed '/foo(1,2)/c\ 
> if (a > 1) {\ 
>  foo(1,2)\ 
> } else {\ 
>  bar(1,2)\ 
> }' 
a 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
b 
if (a > 1) { 
    foo(1,2) 
} else { 
    bar(1,2) 
} 
c 
Cuestiones relacionadas