Пакетное изменение text.txt перед определенным словом

У меня есть файл.txt, где есть строки как

IF TANK T395 LEVEL ABOVE 4 THEN PUMP PFALDA395&T395 STATUS IS CLOSED 

что я хотел бы преобразовать в

IF TANK T395 LEVEL ABOVE 4
THEN PUMP PFALDA395&T395 STATUS IS CLOSED                                 

Я пытался с этим code.bat

@echo off
del "newfile.txt" 2>nul
(
    for /f "eol=| usebackq for /f tokens=1,2,3,4,5,6,* delims= " %%a %%b %%c %%d %%e %%f %%g in ("oldfile.txt") do (
        for /f  %%h in ("%%g") do ( 
            if /i "%%h"=="THEN" ( 
                echo %%a %%b %%c %%d %%e %%f
                echo. %%g
            )
        )
        echo %%a %%b %%c %%d %%e %%f %%g
    )
)>"newfile.txt"

Я быстро

%b non atteso (not waited)

Что я спотыкаюсь в?

2 ответа

Решение

Вы пытались указать переменные для всех токенов во внешнем for команда, но вы должны указать только первый, который %%a в твоем случае; все остальные (%%b, %%c,..., %%g) определяются неявно через tokens вариант (см. также @ комментарий Стефана).

Кроме того, ваш код выводит оригинал и разделенную строку в выходной файл. Поэтому я вставил else пункт.

Наконец, я реализовал дополнительное условие: код ищет IF а теперь и разбивает поэтому только строки, которые начинаются с IF и содержать THEN как 7-й жетон.

@echo off
del "newfile.txt" 2> nul
(
    for /f "eol=| usebackq tokens=1,2,3,4,5,6,* delims= " %%a in ("oldfile.txt") do (
        if /i "%%a"=="IF" (
            for /f "eol=| tokens=1 delims= " %%h in ("%%g") do ( 
                if /i "%%h"=="THEN" ( 
                    echo %%a %%b %%c %%d %%e %%f
                    echo %%g
                ) else (
                    echo %%a %%b %%c %%d %%e %%f %%g
                )
            )
        ) else (
            echo %%a %%b %%c %%d %%e %%f %%g
        )
    )
) > "newfile.txt"

Редактировать:
Приведенное выше решение может быть упрощено после следующего комментария@Aacini:

@echo off
del "newfile.txt" 2> nul
(
    for /f "eol=| usebackq tokens=1-7* delims= " %%a in ("oldfile.txt") do (
        if /i "%%a|%%g"=="IF|THEN" (
            echo.%%a %%b %%c %%d %%e %%f
            echo.%%g %%h
        ) else (
            echo.%%a %%b %%c %%d %%e %%f %%g %%h
        )
    )
) > "newfile.txt"

Здесь только один for петля и один if оговорка обязательна.

Просто замените каждый <space>THEN<space> с <newline>THEN<space>:

@echo off
setlocal enabledelayedexpansion

REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%

for /f "delims=" %%a in (t.txt) do (
  set line=%%a
  echo(!line: THEN =%NL%THEN !
)

(Я взял создание NewLine отсюда)

Другие вопросы по тегам