Пакет: линия и удалить - PullRequest
0 голосов
/ 15 июля 2009

Мне нужен командный файл, который: удаляет определенную строку [line number by %lnum%] в текстовом файле.

Ответы [ 4 ]

3 голосов
/ 15 июля 2009

Звучит как работа для sed. В Windows вам нужно установить порт Windows , а затем вызвать sed из вашего пакетного файла.

sed '<linenumber>d' filename > newfilename

Для удаления 4-й строки:

sed '4d' filename > newfilename
1 голос
/ 28 августа 2009

Чистый cmd?:

delline.cmd число имя файла

@echo off
setlocal ENABLEDELAYEDEXPANSION
set line=%~1
set file=%~nx2
set dSource=%~dp2
set i=0
for /F "delims=" %%l in (%dSource%%file%) do (
    set /a i+=1
    if not !i! EQU %line% call :BuildFile "%%l"
)
del /f "%dSource%%file%" >nul
for %%l in (%_file%) do echo %%~l>>"%dSource%%file%"
endlocal& exit /b 0

:BuildFile
    set _file=%_file% %1
    exit /b 0

___ Примечания _____
1: Нет проверок параметров. Первый должен быть числом, второй файл или путь + файл.
2: Как и в случае с другими ответами, временного файла тоже нет.
3: Использование setlocal позволит вам легко интегрировать этот код в скрипт, назвав его : delline и используя его как: call: delline number файл

ПРЕДУПРЕЖДЕНИЕ: Любая пустая строка из исходного файла будет пропущена / потеряна в процессе чтения ( for..loop ). Файл с 10 строками, из которых 4 являются пробелами, будет считан как 6 строк для обработки. Указанный номер строки будет применен (то есть удален) из 6 строк данных, а не из начальных 10.

Редактировать
Пошел слишком быстро, не увидел ответа Акфа, который выглядит очень близко к моему.

1 голос
/ 15 июля 2009

Если вы находитесь в Windows и хотите сделать это в командном файле, вы можете выполнить следующие действия грубой силой:

@echo off
setlocal ENABLEDELAYEDEXPANSION
SET lineNum=
SET filename=%1
SET targetLine=%2
SET targetFile=%filename%.tmp
DEL %targetFile%
FOR /F "    tokens=1 delims=" %%i in (%filename%) do (
  SET /a lineNum += 1 
  if NOT !lineNum! == !targetLine! ECHO %%i >> !targetFile!
)
REN %filename% %filename%.orig
REN %targetFile% %filename%

Вы передаете в пакет имя целевого файла и номер строки, которую хотите удалить. Он создает временный файл, передает «хорошие» строки из оригинала во временную папку, а затем завершает работу, переименовывая файлы, чтобы сохранить оригинал и иметь измененный файл на месте.

0 голосов
/ 18 июля 2009

не нужно использовать какую-либо внешнюю команду. Вы можете использовать VBScript

Set objFS = CreateObject("Scripting.FileSystemObject")
Set objArgs = WScript.Arguments
num = objArgs(0)
strFile = objArgs(1)
Set objFile = objFS.OpenTextFile(strFile)
Do Until objFile.AtEndOfLine
    linenum = objFile.Line  
    If linenum = Int(num) Then
        objFile.SkipLine
    End If 
    strLine = objFile.ReadLine
    WScript.Echo strLine
Loop

как использовать:

C:\test>cscript /nologo removeline.vbs 4 file.txt > newfile.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...