Reemplazar cadena con contenido de archivo multilínea

Reemplazar cadena con contenido de archivo multilínea

Necesito reemplazar una cadena SALTen un archivo con el contenido de otro archivo. El problema es que el archivo de entrada tiene varias líneas. Probé algo como esto en mi script bash:

SALT=`cat salt.txt`;
sed "s/SALT/$SALT/" wp-config.php > result.txt

Funciona bien cuando elsal.txtes una sola línea, pero si hay más líneas falla. He leído que podría hacer PERL. Pero no sé cómo. ¿Usted me podría ayudar?

Respuesta1

De otra perlmanera:

perl -pe 's/SALT/`cat salt.txt`/e' wp-config.php > result.txt

La clave aquí es la /eopción regexp que nos permite usar el perlresultado de un comando como una cadena de sustitución.

Respuesta2

Si desea ceñirse a bash, elija un carácter que no aparezca ni en su cadena ni en su archivo, digamos @; entonces:

SALT=`< salt.txt tr '\n' '@'`
sed "s/SALT/$SALT/" wp-config.php | tr '@' '\n' > result.txt

De esta manera, antes del reemplazo, los newlinecaracteres en su cadena se cambian a @y después del reemplazo, los @caracteres se vuelven a cambiar newlines, por lo que SALTya no se trata como una matriz, sino solo como una variable que contiene una cadena larga.

Respuesta3

Puedes hacerlo:

sed -e "/SALT/{r salt.txt" -e "d}" wp-config.php  > result.txt

¿Dónde salt.txtestá la sal, wp-config.phpes el archivo de entrada y SALTes la cadena a reemplazar?

Respuesta4

perl -e 'open my $S, "<", "salt.txt" or die $!;
         $salt = do { local $/ ; <$S> };
         s/SALT/$salt/, print while <>;
        ' wp-config.php > result.txt

La primera línea abre el salt.txt.
La segunda línea lee su contenido en la variable $salt.
El tercero toma los argumentos de la línea de comando como nombres de archivos, lee los archivos línea por línea y reemplaza la cadena.

información relacionada