Agregar una cadena multilínea después de una cadena específica

Agregar una cadena multilínea después de una cadena específica

Estoy intentando insertar una cadena de varias líneas en un archivo después de encontrar una cadena específica. Ya busqué y probé muchas opciones, pero ninguna arrojó el resultado que esperaba.

Aquí está el bloque que quiero editar:

var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var log = require("cf-nodejs-logging-support");

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express(); //After this line I want to insert several lines

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

module.exports = app;

Y un ejemplo de las líneas que me gustaría insertar:

function x (test){
    console.log("TEST");
}

Entonces el archivo final debería verse así:

var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var log = require("cf-nodejs-logging-support");

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

function x (test){
    console.log("TEST");
}

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);
app.use('/users', usersRouter);

module.exports = app;

Una de las posibles soluciones que probé es el siguiente bloque de código, pero no pude lograr que insertara varias líneas que incluyeran espacios:

@echo off
setlocal enabledelayedexpansion
ren in.txt in.tmp
set p=
for /f %%a in (in.tmp) do (
if "%%a"=="5" if "!p!"=="var app = express();" Echo 4 >> in.txt
Echo %%a >>in.txt
set p=%%a
)
del in.tmp

Preferiría una solución que no requiera la instalación de ningún software adicional. Pero si no hay otra manera, esto también estaría bien. Actualmente estoy trabajando en una PC con Windows 7, pero este script también debería funcionar en Windows 10.

Todo mi script (que es mucho más grande que el que mostré aquí) está escrito como un archivo por lotes simple.

Respuesta1

Pasé por muchos métodos demasiado complejos antes de llegar a lo siguiente:

@echo off

set "txt=C:\Your\Text\File.txt"
set "old=var app = express();"

setlocal enabledelayedexpansion
for /f "delims=" %%A in ('type "%txt%" ^| find /v /n "" ^& break ^> "%txt%" ') do (
    set "line=%%A"
    set "line=!line:*]=!"
    if not "!line!" == "!old!" >>"%txt%" echo(!line!
    if "!line!" == "!old!" (
        echo(!old!
        echo.
        echo(function x ^(test^)^{
        echo(   console.log^("TEST"^);
        echo(^}
    )>>"%txt%"
)

endlocal

En realidad, es muy sencillo: la única parte elegante aquí es el 'type "%txt%" ^| find /v /n "" ^& break ^> "%txt%" 'bit porque nos evita tener que crear un nuevo archivo y también requiere que eliminemos el conteo de líneas desde el principio de la !line!variable antes de volver a escribirlo en nuestro archivo. (esto es lo que set "line=!line:*]=!"hace).

Más allá de eso, esto simplemente revisa todas sus líneas y, si no lo están, var app = express();simplemente repite la línea tal como está nuevamente en el archivo; si la lineaes var app = express();en su lugar, hace eco var app = express();seguido de una línea en blanco ( echo.) y luego las líneas que buscaba agregar. La otra cosa a tener en cuenta era escapar de las ('s, )'s y }'s.

Puede haber un problema si tiene ]' en otra parte del guión, así que si tiene alguna pregunta, hágamelo saber.

información relacionada