簡體   English   中英

批處理:替換文本文件中的一行

[英]batch: replace a line in a text file


我正在嘗試替換此行:

#        forward-socks5   /               127.0.0.1:9050 .

與此:

        forward-socks5   /               127.0.0.1:9050 .

該行屬於一個配置文件,必須通過從一開始刪除#號來啟用(未注釋),除了將其替換為沒有#號的其他行,我沒有想到更好的方法。
任何其他想法或方式將非常有用。

順便說一句,文本前面的空格也在那里。
我已經粘貼了原始文件中的文本。

提前致謝


編輯:
我已經設法通過使用找到的兩個代碼來完成行的添加和刪除。 我唯一的問題是,以下代碼刪除了輸出文件中的所有驚嘆號!

@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

我想知道是否有任何一種方法可以一步完成查找/刪除/添加行(不是我的兩步)...

行包含! 損壞,因為在FOR變量( %%A )擴展后發生了延遲擴展。 這可以通過禁用延遲擴展來解決。 在循環中,將%%A的值保存在變量中,然后打開延遲擴展,處理該行,然后再將其關閉。

您無需在SET / A計算中擴展變量。

通過在循環中添加IF語句,您可以一步一步完成所有操作。

實際上,您甚至根本不需要SET / A或FINDSTR。 您的IF語句可以測試該行是否與您的搜索字符串匹配。 您實際上並不需要因問題而延遲擴展。

將整個循環括在parens中,然后僅重定向到輸出文件一次,效率更高。

@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)
  )
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM