Показать полную графическую версию : [решено] echo без пустой строки
Добрый день!
при попытке передать информацию в файл (echo text >> file.txt) подставляется пустая последняя строка. Есть ли возможность удалить ту самую последнюю (пустую) строку ?
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »
Та самая строка формируется конечным символом перевода строки командой echo
Не знаю, зачем понадобилось убирать эту строку, т.к. при добавлении текста в этот файл командой >> (после удаления пустой строки, то бишь символа перевода строки), этот текст "склеится" с последней строкой... но, в принципе так:
<nul set /p =текст>>out.txt
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »
Удалить — нет. Не добавлять символы перевода строки и возврата каретки (0x0D, 0x0A) — да.
Токмо лучше наоборот — на всякий случай:
>>"out.txt" <nul set /p sVar=текст
на всякий случай: »
если от такого: (<nul set /p=TEXT 1>>out.txt), да, (>>out.txt <nul set /p=TEXT 1) спасет
если от такого: (<nul set /p=TEXT |>>out.txt), хоть где не пиши запись в файл, спасет только:
>>out.txt <nul set /p="TEXT |"
alpap, от первого. Особенно неприятно, когда номером потока оказывается часть содержимого переменной окружения или переменной цикла разбора: зараз и не обратишь внимания, что куда пропало.
Да, естественно, всё верно. Если требуется соломки подстелить, то лучше сначала продумать, какие возможные символы на вход могут подаваться, а потом уже код составлять в соответствии с этим думками :)
Ну а если, вдруг, понадобится, что-то уж слишком снабженное разными хитрыми знаками, то можно и такой вот зубодробительный код соорудить:
почти однострок:
@echo off&set "x=|"&set var=^^!*"'||&*)"%%=^|", ;<>
cmd/v/c echo.^&set x=!x:^^^^=^^^^^^^^!^&for /f usebackq^^ tokens^^=1-4^^ delims^^=^^^%x%^^ eol^^= %%i in ('!var:^^^%x%^^=?^^^%x%!') do @set i=%%i^&set j=%%j^&set k=%%k^&echo. [!i:~^^,-1!] ^&echo. [!j:~^^,-1!]^&echo. [!k:~^^,-1!] ^&echo. [%%l]^&echo.^&echo.!i:~^^,-1!!x!!j:~^^,-1!!x!!k:~^^,-1!!x!%%l^&echo.^&exit /b
и пользоваться даже злобными спецсимволами... :)
megaloman
24-01-2019, 20:08
Удалить — нет. Не добавлять символы перевода строки и возврата каретки (0x0D, 0x0A) — да. »
При этом при выводе заранее узнать, какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле (по отсутствию этого самого файла или при пересоздании этого файла при выводе первой строки) - нет проблем. Поэтому, чтобы текст не "склеивался":
>"out.txt" (<nul set /p sVar=текст1)
>>"out.txt" (Echo.&<nul set /p sVar=текст2)
>>"out.txt" (Echo.&<nul set /p sVar=текст3)
и так далее
megaloman,
собственно изменять(ить) можно только последнюю строку вывода (вернее записи)
@echo off
>>"out.txt" (
echo текст1
echo текст2
echo:& <nul set /p="текст3"
)
pause
megaloman
24-01-2019, 22:55
alpap, изменять(ить) можно только последнюю строку вывода »Фишка моего предложениязаранее узнать,какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле - нет проблем. »Проще обработать особым образом первую строку, зато последующие можно не думая выдавать единообразным образом ни о чем не думая.
То есть в первой строке записываем текст без Cr Lf на конце, а последующие строки пишем как Cr+Lf+Текст
Фишка моего предложения »
фишку понял и предложу вариант с почти одинаковым написанием строк, разница лишь в нумерации, несложно добавить в поток, а может изначально будет или будет не лишней для кого-то по задаче:
@echo off
set "$_1=текст1"
set "$_2=текст2"
set "$_3=текст3"
>"out.txt" (for /f "tokens=2* delims=_=" %%a in ('set $_') do @(
if %%a==1 (
<nul set /p="%%b"
) else (
echo:& <nul set /p="%%b"
)
)
)
pause
заранее узнать, какая строка последняя часто очень проблематично, зато узнать, первая ли это строка в файле »
Не совсем так...
@echo off
set "file_in=test.txt"
set "file_out=out.txt"
for /f "tokens=1 delims=:" %%a in ('findstr /inrc:".*" "%file_in%"') do set /a end=%%~a
for /f "tokens=1,* delims=:" %%a in ('findstr /inrc:".*" "%file_in%"') do (
if %%~a neq %end% (>>"%file_out%" echo.%%~b) else (<nul >>"%file_out%" set /p "=%%~b")
)
pause
megaloman
25-01-2019, 12:33
Есть ли возможность удалить ту самую последнюю (пустую) строку ? »Удалить — нет. »Если нельзя, но очень хочется, то можно (через перезапись исходного файла)@Echo Off
Set "File=Z:\Box_In\CrLf_file.txt"
Del "%File%.tmp" 2>nul
FOR /F "usebackq delims=" %%s IN (`2^>nul more "%File%"`) DO (
If Exist "%File%.tmp" (>>"%File%.tmp" (Echo.&<nul set /p @s=%%s)) Else (>"%File%.tmp" (<nul set /p @s=%%s))
)
Move /Y "%File%.tmp" "%File%" >nul
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.