2012-10-04 82 views
2

我想寫一個批處理腳本,用戶可以輸入行號,腳本將刪除文本文件的那一行。如何使用batch(.bat)腳本給出行號,刪除一行文本文件?

如:tmp.txt

1. aaa 
2. bbb 
3. ccc 
4. ddd 

我希望當我執行我的腳本和用戶輸入3,tmp.txt是

1. aaa 
2. bbb 
4. ddd 

我想是這樣的:

@ECHO OFF 

SET /P LINENUMBER=Enter the Line No: 

FOR /F "tokens=1* delims=[]" %%a IN ('FIND /n /v "" ^< tmp.txt') DO ( 
    IF %%a equ %LINENUMBER% (
        ???????????????????? 
    ) 
) 
+0

你嘗試寫的一切,但你要刪除的行? IF %% a NEQ%LINENUMBER% –

+0

如果你有一個Windows版本的'sed',它很簡單:'sed「%LINENUMBER%d」file「。 –

回答

2

您不能直接修改文件。您必須創建一個具有所需內容的新文件,然後用新文件替換原始文件。

您可以通過重定向輸出和ECHOing所需內容來創建新文件。在%% b爲空的情況下,我使用ECHO(%%b,因爲該行爲空。如果b爲空,則ECHO %%b將產生ECHO is off.。大多數人使用ECHO.,但在神祕的條件下可能會失敗。 ECHO(永遠不會失敗。

您可以使用MOVE將新文件替換爲原始文件。

可以不再需要使用FINDSTR FIND後過濾掉不需要的行你FOR/F循環內檢查的數量。

請注意,到目前爲止,您的代碼將刪除每行的前導字符[]。由於在FOR迭代之前應用了線路濾波器,因此只需將DELIMS設置爲]即可稍微改善情況。

@ECHO OFF 
SET /P LINENUMBER=Enter the Line No: 
>tmp.txt.new (
    FOR /F "tokens=1* delims=]" %%a IN (
    'FIND /n /v "" ^<tmp.txt^|FINDSTR /VLB "[%LINENUMBER%]"' 
) DO ECHO(%%b 
) 
>nul MOVE /y tmp.txt.new tmp.txt 

如果您有任何原線路已經開始]那麼你可以使用FINDSTR,而不是找引進的行號。這使用nn:格式而不是[nn]。該解決方案將剝離您的線路中的前導:

@ECHO OFF 
SET /P LINENUMBER=Enter the Line No: 
>tmp.txt.new (
    FOR /F "tokens=1* delims=:" %%a IN (
    'FINDSTR /n "^" tmp.txt^|FINDSTR /VLB "%LINENUMBER%:"' 
) DO ECHO(%%b 
) 
>nul MOVE /y tmp.txt.new tmp.txt 

如果文本文件包含有:]開始都那麼你可以不使用線/ F解析出的行號。而是使用搜索和替換。延遲擴展在循環中打開和關閉,以保護文件中可能存在的任何!

@ECHO OFF 
setlocal disableDelayedExpansion 
SET /P LINENUMBER=Enter the Line No: 
>tmp.txt.new (
    FOR /F "delims=" %%a IN (
    'FINDSTR /n "^" tmp.txt ^| FINDSTR /VLB "%LINENUMBER%:"' 
) DO (
    set "ln=%%a" 
    setlocal enableDelayedExpansion 
    echo(!ln:*:=! 
    endlocal 
) 
) 
>nul MOVE /y tmp.txt.new tmp.txt 
+0

ECHO.'如何失敗?我是一批瘋子,爲了好玩而嘗試隨機的東西,並希望看到發生。 –

+0

@JeffreyLin - 看到這個非常有趣的DOSTips線程的主題:http://www.dostips.com/forum/viewtopic.php?p=2527 – dbenham

+0

這很有趣,但在正常情況下,我使用期間,因爲格式化顯示出更清潔。 –

1

試試這個:

@echo off & setlocal 
set "InFile=Z:\Text.txt" 
set "OutFile=Z:\Erg.txt" 
set /p LineToDelete= 

if exist "%OutFile%" del "%OutFile%" 
for /f "tokens=1* delims=:" %%i in ('findstr /n $ "%InFile%"^|findstr /b "%LineToDelete%:"') do findstr /v /b /c:"%%j" "%InFile%">>"%OutFile%" 
相關問題