Como dijo dbenham, también se puede hacer con/f pero es un poco más complicado.
La sencilla solución al 80% es
setlocal EnableDelayedExpansion
set "var="
set LF=^
rem *** Two empty lines are required for the linefeed
FOR /F "delims=" %%a in (myFile.txt) do (
set "var=!var!!LF!%%a"
)
echo !var!
pero fracasa con:
- Si una línea está en blanco que se omitirá
- Si una línea comienza con ;
la EOL caracteres
- Si una línea contiene !
(y signos de intercalación)
Pero entonces usted podría utilizar un poco más compleja solución
@echo off
SETLOCAL DisableDelayedExpansion
set "all="
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ aux1.txt"`) do (
set "line=%%a"
SETLOCAL EnableDelayedExpansion
set "line=!line:#=#S!"
set "line=!line:*:=!"
for /F "delims=" %%p in ("!all!#L!line!") do (
ENDLOCAL
set "all=%%p"
)
)
SETLOCAL EnableDelayedExpansion
if defined all (
set "all=!all:~2!"
set ^"all=!all:#L=^
!"
set "all=!all:#S=#!"
)
echo !all!
¿Qué hace el código?
primer lugar, el findstr /n ^^
antepondrá cada línea con un número de línea y dos puntos, al igual que
1:My first Line
2:; beginning with a semicolon
3:
4:there was an empty line
Esto resuelve el problema de las líneas vacías y también el estándar de EOL-carácter ;
puede ser ignorada.
Para obtener el contenido de la línea, el valor se establece en una variable, mientras que la expansión retrasada está deshabilitada, esto resuelve el problema con los caracteres !
y ^
.
Para eliminar el número de línea y los dos puntos, la expansión retrasada se habilitará (no, un delim de :
no puede resolverlo).
Luego todos #
se reemplazan por #S
, esto se hará primero, ya que después del prefijo que quita la línea podría estar vacía y la sustitución fallaría.
¿Pero por qué lo reemplazo?
Eso es porque no puedo insertar los saltos de línea aquí, ya que el siguiente PARA/F fallaría con saltos de línea embebidos,
por lo que sólo añadir marcador de salto de línea (en este caso uso #L
), pero el contenido del archivo podría contener también un #L
, pero reemplazando todos #
con #S
todos los marcadores son únicos.
Después del marcador, existe el problema de cerrar/deshabilitar la expansión retrasada con un endlocal
, pero conservar el contenido de las variables all
y line
modificadas.
Esto se hace con el truco FOR/F-endlocal
, ya que el %%p
puede transportar contenido detrás de la barrera endlocal
.
Luego de leer el archivo completo, verifico si el all
está definido, ya que estaría vacío para un archivo vacío.
Luego se eliminará el primer marcador de alimentación de línea#L
, y todos los demás marcadores se reemplazarán por un carácter de avance de línea real.
Luego, el seguro más seguro #S
se revertirá a #
.
Eso es todo, por lo que incluso esta solución es obviamente ...
es el quilate^realmente en el archivo, o es que un marcador de posición para un CRLF? Supongo que esta es una máquina de Windows. – RobW
El símbolo de intercalación está realmente en el archivo, es la forma de crear una variable que contenga un carácter de avance de línea. 'set LF = ^' seguido de dos líneas vacías – jeb
gracias jeb para la aclaración –