特定の文字列の後に複数行の文字列を追加する

特定の文字列の後に複数行の文字列を追加する

特定の文字列が見つかった後、ファイルに複数行の文字列を挿入しようとしています。すでに多くのオプションを検索して試しましたが、どれも期待した結果を返しませんでした。

編集したいブロックは次のとおりです。

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;

私が試した潜在的な解決策の 1 つは次のコード ブロックですが、スペースを含む複数の行を挿入することはできませんでした。

@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 PC で作業していますが、このスクリプトは 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();代わりに、var app = express();'s の後に空白行 ( echo.) が続き、その後に追加しようとしていた行がエコーされます。他に覚えておくべきことは、('s、)'s、および}'s をエスケープすることです。

スクリプトの他の場所に 'sがある場合は問題が発生する可能性がありますので]、質問がある場合はお知らせください。

関連情報