Удалить номера строк с помощью командного файла - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь создать скрипт, который удаляет специфические строки файла .txt по его номеру.Я уже понял:

@echo off
for /f "skip=1delims=*" %%a in (test.txt) do (
echo %%a >>newfile.txt
) >nul

Работает нормально и удаляет номер строки '1'.Но если я добавлю больше строк для удаления, это не сработает, см. Ниже:

@echo off
for /f "skip=1,5,8) delims=*" %%a in (test.txt) do (
echo %%a >>newfile.txt
) >nul

Что такое Вонг?

Ответы [ 3 ]

0 голосов
/ 09 июня 2018

В соответствии с предложением findstr и для / f - инструменты для использования.
Я добавляю условное выполнение при неудаче || или при успехе && если findstr не обнаруживает текущий номер строки (созданный параметром / n), заключенный в запятые в отраженной переменной skip, строка записывается в новый файл.

:: Q:\Test\2018\06\09\SO_50777309.cmd
@echo off
:: generate test.txt with Line1..10
(for /l %%A in (1,1,10) do @Echo=Line%%A) >test.txt

Set "skip=,1,5,8,"
(for /f "tokens=1,*delims=:" %%a in (' findstr /n "^" ^<test.txt'
) do Echo=%skip%|findstr ",%%a," 2>&1>NUL ||Echo=%%b
)>newfile.txt

type newfile.txt

Примервывод

Line2
Line3
Line4
Line6
Line7
Line9
Line10
0 голосов
/ 10 июня 2018

Вот вариант без трубы (|), который должен быть быстрее.Кроме того, строки с начальными двоеточиями (:) или скобками ([ / ]) должны корректно обрабатываться здесь:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "_FILE=test.txt"
set "_FNEW=newfile.txt"
set "_SKIP=,1,5,8,"

> "%_FNEW%" (
    for /F "delims=" %%L in ('findstr /N "^" "%_FILE%"') do (
        set "LINE=%%L"
        for /F "delims=:" %%K in ("%%L") do (
            setlocal EnableDelayedExpansion
            if "!_SKIP!"=="!_SKIP:,%%K,=,!" (
                echo(!LINE:*:=!
            )
            endlocal
        )
    )
)

endlocal
exit /B
0 голосов
/ 09 июня 2018

, как уже отмечалось в комментариях, skip не помогает.Вместо этого добавьте номера строк (с find /v /n "") и выведите исходную строку (token2) без номера строки, если номер строки (token1) отсутствует в списке:

@echo off
(for /f "tokens=1,* delims=[]" %%a in ('type test.txt^|find /v /n ""') do (
    echo/%%a|findstr /x "1 5 8" >nul || echo/%%b
))>newfile.txt

(findstr switch)x важно сравнивать целое число, поэтому 2018 не найдено с findstr "1")

|| работает как "если предыдущая команда (findstr) не выполнена, то"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...