4


私はこの行を置き換えようとしています:

#        forward-socks5   /               127.0.0.1:9050 .

これで:

        forward-socks5   /               127.0.0.1:9050 .

この行は、最初から#記号を削除して有効にする(コメントなし)必要がある構成ファイルに属しています。この行を#記号のない別の行に置き換える以外に、これ以上の方法は考えられませんでした。
他の考えや方法は非常に役立ちます。

ところで、テキストの前のスペースもあります。
元のファイルと同じようにテキストを貼り付けました。

前もって感謝します


編集:
私はどういうわけか私が見つけた2つの平和なコードを使用して行の追加と削除を行うことができました。私の唯一の問題は、次のコードが出力ファイルの感嘆符のすべてのビットを削除することです!

@echo off

:Variables
SETLOCAL ENABLEDELAYEDEXPANSION
set InputFile=config.txt
set OutputFile=config-new.txt
set _strFind=#        forward-socks5   /               127.0.0.1:9050 .
set _strInsert=        forward-socks5   /               127.0.0.1:9050 .
set i=0

:Replace
for /f "usebackq tokens=1 delims=[]" %%A in (`find /n "%_strFind%" "%InputFile%"`) do (set _strNum=%%A)
for /f "usebackq delims=" %%A in ("%InputFile%") do (
  set /a i = !i! + 1
  echo %%A>>"%OutputFile%"
  if [!i!] == [%_strNum%] (echo %_strInsert%>>"%OutputFile%")
)
type %OutputFile% | findstr /i /v /c:"%_strFind%">config-new2.txt

検索/削除/追加の両方の行を1つのステップで実行する方法があるかどうか疑問に思っていました(私のように2つのステップではありません)...

4

1 に答える 1

17

FOR変数( )の展開後に拡張の遅延が発生するため、を含む行!が破損しています。%%Aこれは、遅延拡張を無効にして開始することで解決できます。ループ内で、の値を変数に保存してから%%A、遅延展開をオンに切り替え、行を処理してから、オフに戻します。

SET/A計算内で変数を展開する必要はありません。

ループ内にIFステートメントを追加することで、すべてを1つのステップで実行できます。

実際、SET/AやFINDSTRはまったく必要ありません。IFステートメントは、その行が検索文字列と一致するかどうかをテストできます。問題のために拡張を遅らせる必要はありません。

ループ全体をparensで囲み、出力ファイルに1回だけリダイレクトする方が効率的です。

@echo off
setlocal disableDelayedExpansion

:Variables
set InputFile=config.txt
set OutputFile=config-new.txt
set "_strFind=#        forward-socks5   /               127.0.0.1:9050 ."
set "_strInsert=        forward-socks5   /               127.0.0.1:9050 ."

:Replace
>"%OutputFile%" (
  for /f "usebackq delims=" %%A in ("%InputFile%") do (
    if "%%A" equ "%_strFind%" (echo %_strInsert%) else (echo %%A)
  )
)
于 2012-11-04T17:26:26.593 に答える