Я пытаюсь вставить многострочную строку в файл после того, как была найдена определенная строка. Я уже искал и пробовал много вариантов, но ни один из них не дал ожидаемого результата.
Вот блок, который я хочу отредактировать:
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;
И пример строк, которые я хотел бы вставить:
function x (test){
console.log("TEST");
}
Таким образом, окончательный файл должен выглядеть следующим образом:
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;
Одним из возможных решений, которые я попробовал, является следующий блок кода, но мне не удалось заставить его вставить несколько строк, содержащих пробелы:
@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
Я бы очень предпочел решение, которое не требует установки дополнительного программного обеспечения. Но если нет другого пути, это тоже было бы нормально. В настоящее время я работаю на ПК с Windows 7, но этот скрипт должен работать и на Windows 10.
Весь мой скрипт (который намного больше того, что я показал здесь) написан как простой пакетный файл.
решение1
Я перепробовал множество слишком сложных методов, прежде чем пришел к следующему:
@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
На самом деле все очень просто — единственная необычная часть здесь — это бит , 'type "%txt%" ^| find /v /n "" ^& break ^> "%txt%" '
поскольку он избавляет нас от необходимости создавать новый файл, а также требует от нас удалить все, что связано с подсчетом строк, из начала переменной !line!
перед ее записью обратно в файл (именно это и set "line=!line:*]=!"
делает ).
Помимо этого, эта команда просто просматривает все ваши строки и, если они не соответствуют требованиям, var app = express();
просто выводит строку как есть обратно в файл. Если строкаявляется var app = express();
вместо этого echo's, var app = express();
за которым следует пустая строка ( echo.
), а затем строки, которые вы хотели добавить. Другое, что нужно иметь в виду, — это экранирование (
's, )
's и }
's.
]
Если в скрипте где-то еще есть символы ', могут возникнуть проблемы , поэтому если у вас возникнут какие-либо вопросы, просто дайте мне знать.