[英]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.