简体   繁体   中英

Windows/CMD | How to break line if e.g. character count reached?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM