Adicionar string multilinha após string específica

Adicionar string multilinha após string específica

Estou tentando inserir uma string multilinha em um arquivo depois que uma string específica foi encontrada. Já pesquisei e tentei diversas opções, mas nenhuma delas retornou o resultado que esperava.

Aqui está o bloco que desejo 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;

E um exemplo das linhas que gostaria de inserir:

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

Portanto, o arquivo final deverá ficar assim:

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;

Uma das possíveis soluções que tentei foi o seguinte bloco de código, mas não consegui inserir várias linhas que incluíssem espaços:

@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

Eu preferiria uma solução que não exigisse a instalação de nenhum software adicional. Mas se não houver outra maneira, isso também estaria OK. Atualmente estou trabalhando em um PC com Windows 7, mas este script também deve funcionar no Windows 10.

Todo o meu script (que é muito maior do que o que mostrei aqui) é escrito como um arquivo em lote simples.

Responder1

Passei por muitos métodos excessivamente complexos antes de chegar ao seguinte:

@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

Na verdade, é muito simples - a única parte sofisticada aqui é o 'type "%txt%" ^| find /v /n "" ^& break ^> "%txt%" 'bit, porque nos impede de ter que criar um novo arquivo e também exige que removamos a contagem de linhas do início da !line!variável antes de gravá-la de volta em nosso arquivo (isso é o que set "line=!line:*]=!"faz).

Além disso, isso apenas examina todas as suas linhas e, se não estiverem, var app = express();apenas ecoa a linha como está de volta no arquivo; se a linhaé var app = express();em vez disso, o eco é var app = express();seguido por uma linha em branco ( echo.) e, em seguida, pelas linhas que você deseja adicionar. A outra coisa a ter em mente era escapar dos ('s, )'s e }'s.

Pode haver um problema se você tiver em ]algum outro lugar do script, então se você tiver alguma dúvida, entre em contato.

informação relacionada