I wrote a batch file where I put in a bunch of text that gets set to some variable and then next line echoes that variable into a text file.
Problem is that it echoes all of it into one long line and it's impossible to read (it forces you to toggle wrap mode, but what if software doesn't support it).
echo "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra euismod nisl, nec malesuada turpis pellentesque eget." > text_file.txt
(just look at this example, it's unreadable)
So I need to print it into something like:
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit
eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed
aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla
rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus
sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia
nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis
sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi
tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed
ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque
libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra
euismod nisl, nec malesuada turpis pellentesque eget."
As you can see, the longest line is 76
characters. Is it possible to use it as a breakpoint or something?
But that would also mean it can't chop it in the middle of the word.
UPDATE: I found same question and answer on Linux https://unix.stackexchange.com/questions/60219/is-there-a-command-line-tool-to-insert-line-breaks-into-a-long-string the command is called fold
. Any alternative to Windows?
Coincidentally, I wrote something like this about 4 years ago when I was first starting to learn batch. It almost certainly doesn't accept &
s or )
s, but you don't have any in your sample text and I don't care enough to test for them.
Pass the string in as a single parameter.
@echo off
setlocal enabledelayedexpansion
cls
set unformattedText=Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra euismod nisl, nec malesuada turpis pellentesque eget.
set width=76
set counter=0
set slashN=^
if not [%1]==[] set unformattedText=%~1
:wordCounter
for /f "tokens=1,* delims= " %%A in ("%unformattedText%") do (
if not "%%A"=="" (
set words[!counter!]=%%A
set /a counter=!counter!+1
set unformattedText=%%B
goto wordCounter
) else (
goto loopBreak
)
)
:loopBreak
echo There are !counter! words in your sentence.
set /a counter=!counter!-1
for /l %%A in (0,1,!counter!) do (
echo !words[%%A]!>tmp.txt
for %%J in (tmp.txt) do (
set /a len[%%A]=%%~zJ
set /a len[%%A]-=2
del tmp.txt
if !len[%%A]! gtr %width% set /a width=!len[%%A]!+1
)
)
:: -- Concatenate the words and spaces --
set newString=
set stringLength=0
for /l %%A in (0,1,!counter!) do (
if %%A lss !counter! (
set /a possLength=!stringLength!+!len[%%A]!+1
if !possLength! leq %width% (
set newString=!newString!!words[%%A]!
set /a stringLength+=!len[%%A]!+1
) else (
set newString=!newString!!slashN!!words[%%A]!
set /a stringLength=!len[%%A]!+1
)
) else (
set /a possLength=!stringLength!+!len[%%A]!
if !possLength! leq %width% (
set newString=!newString!!words[%%A]!
set /a stringLength+=!len[%%A]!
) else (
set newString=!newString!!slashN!!words[%%A]!
set /a stringLength=!len[%%A]!
)
)
)
echo !newString!
This is my version...
EDIT : I modified the code, so the split method is now isolated in a subroutine that may be called by any program.
The subroutine cut the string at a space previous to the maximum allowed length, and repeat this procedure as long as there is a remaining string.
@echo off
setlocal
set longString="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus at elit eu felis gravida pretium. Morbi suscipit eu metus quis facilisis. Sed aliquet eget sem ac semper. Fusce tempor magna dui, nec ullamcorper nulla rutrum eget. Suspendisse mattis lorem ut nulla placerat vestibulum. Vivamus sollicitudin nisl in lorem suscipit luctus. Nam a nisi vestibulum, lacinia nulla faucibus, condimentum eros. Donec fringilla neque et massa sagittis sollicitudin. Pellentesque vestibulum, metus maximus lacinia varius, nisi tortor facilisis ante, et porttitor magna urna sed odio. Maecenas ut mi sed ipsum pretium mattis et a urna. Nunc vulputate ornare bibendum. Pellentesque libero lacus, porttitor ut sem vitae, lobortis dictum erat. Sed viverra euismod nisl, nec malesuada turpis pellentesque eget."
rem To show lines in screen:
call :splitLines longString 76
rem To store lines in a file:
call :splitLines longString 76 > file.txt
goto :EOF
:splitLines string width
setlocal EnableDelayedExpansion
set "string=!%~1!"
:nextLine
set /A "i=%~2+1"
:prevChar
set /A i-=1
if "!string:~%i%,1!" neq " " goto prevChar
echo !string:~0,%i%!
set /A i+=1
set "string=!string:~%i%!"
if "!string:~%~2!" neq "" goto nextLine
echo !string!
exit /B
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.