Пакетный файл Windows - удалить данные после разделителя


0

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

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

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

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

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

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

@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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.