Я видел несколько примеров того, что мне нужно, и попытался изменить их безуспешно.

Начальная информация:

a:b:c:d:e:f

Желаемый формат:

a:b

Информация будет вставлена в 1 текстовый файл paste_here.txt а вывод должен перейти в новый файл check.txt .

Моя текущая попытка:

@echo off
setlocal

for /f "tokens=1,2 delims=:" %%a in (paste_here.txt) do (echo %%a >> check.txt)

1 ответ1

1

Ваш вопрос не ясен. Обеспечение ввода и вывода образцов - это хорошо, но вы также должны объяснить свои требования.

Я предполагаю, что у вас есть несколько столбцов с разделителями в каждой строке, и вы хотите сохранить первые два столбца каждой строки. Я также предполагаю, что ширина столбцов является переменной, даже если в вашем примере только один символ на столбец.

Ваш код сохраняет только первый столбец. Нетрудно сохранить второе:

@echo off
setlocal
for /f "tokens=1,2 delims=:" %%A in (paste_here.txt) do >>check.txt echo %%A:%%B

Но есть потенциальная проблема - она потерпит неудачу, если отсутствует второй столбец. Например,

a::c:d:e:f

даст

a:c

потому что последовательные разделители обрабатываются FOR /F как один разделитель.

Это не сложно исправить, но это требует некоторых продвинутых методов пакетной обработки.

  • Вы можете сохранить всю строку во внешнем цикле и использовать поиск / замену, чтобы заключить каждый столбец в кавычки. Затем можно использовать второй цикл для анализа столбцов и модификатор ~ для удаления кавычек во время вывода.

  • Отложенное расширение требуется для работы с переменными, которые установлены и раскрыты в одном и том же цикле.

  • Задержка расширения включается и выключается для защиты ! это может появиться в содержании. Для переменного содержимого с ! будет поврежден, если он будет расширен, пока включено отложенное расширение.

  • Синтаксис нечетной опции во внешнем операторе FOR / F - это способ отключить опцию EOL и установить для DELIMS ничего, чтобы он сохранял всю строку независимо от содержимого.

Также обратите внимание, что более эффективно (быстрее) использовать круглые скобки и перенаправлять один раз для всего файла, а не один раз на строку.

@echo off
setlocal disableDelayedExpansion
>check.txt (
  for /f delims^=^ eol^= %%A in (paste_here.txt) do (
    set "ln=%%A"
    setlocal enableDelayedExpansion
    set "ln="!ln::=":"!""
    for /f "tokens=1,2 delims=:" %%B in ("!ln!") do echo %%~B:%%~C
    endlocal
  )
)

Или вы можете использовать гибридную утилиту JScript/batch REPL.BAT, чтобы очень эффективно выполнить вашу задачу за один шаг. REPL.BAT выполняет поиск / замену регулярных выражений в stdin и записывает результат в стандартный вывод. Это чистый скрипт, который будет работать на любой машине с Windows начиная с XP.

type paste_here.txt | repl "^(.*?:.*?):.*" $1 >check.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .