Plik wsadowy Windows - usuń dane po separatorze

0

Widziałem kilka przykładów tego, czego potrzebuję i próbowałem modyfikować je bez powodzenia.

Informacje początkowe:

a:b:c:d:e:f

Pożądany format:

a:b

Informacje zostaną wklejone do 1 pliku tekstowego, paste_here.txta dane wyjściowe powinny przejść do nowego pliku check.txt.

Moja obecna próba to:

@echo wyłączone
setlocal

dla / f "tokenów = 1,2 delims =:" %% a in (paste_here.txt) do (echo %% a >> check.txt)
DMS
źródło

Odpowiedzi:

1

Twoje pytanie nie jest jasne. Zapewnienie przykładowych danych wejściowych i wyjściowych jest dobrą rzeczą, ale powinieneś także wyjaśnić swoje wymagania.

Zakładam, że masz wiele kolumn rozdzielanych dwukropkami w każdej linii i chcesz zachować dwie pierwsze kolumny każdej linii. Zakładam również, że szerokości kolumn są zmienne, nawet jeśli twój przykład ma tylko jeden znak na kolumnę.

Twój kod zachowuje tylko pierwszą kolumnę. Zachowanie drugiego nie jest trudne:

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

Ale istnieje potencjalny problem - nie powiedzie się, jeśli brakuje drugiej kolumny. Na przykład,

a::c:d:e:f

ustąpi

a:c

ponieważ kolejne separatory są traktowane przez FOR / F jako pojedynczy separator.

Nie jest to trudne do naprawienia, ale wymaga zaawansowanych technik wsadowych.

  • Możesz zachować cały wiersz w zewnętrznej pętli i użyć funkcji szukaj / zamień, aby zawrzeć każdą kolumnę w cudzysłowie. Następnie można użyć drugiej pętli do parsowania kolumn i ~modyfikatora w celu usunięcia cudzysłowów podczas wyświetlania.

  • Opóźnione rozwinięcie jest wymagane do pracy ze zmiennymi ustawionymi i rozwiniętymi w tej samej pętli.

  • Opóźnione rozszerzenie jest włączane i wyłączane w celu ochrony, !która może pojawić się w treści. FOR zmienna zawartość z !zostanie uszkodzona, jeśli zostanie rozwinięta przy włączonym opóźnionym rozszerzaniu.

  • Składnia opcji nieparzystych w zewnętrznej instrukcji FOR / F jest sposobem na wyłączenie opcji EOL i ustawienie DELIMS na nic, aby zachował całą linię, niezależnie od zawartości.

Zauważ też, że bardziej wydajne (szybsze) jest używanie nawiasów i przekierowywanie raz dla całego pliku zamiast raz na linię.

@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
  )
)

Możesz też użyć hybrydowego narzędzia JScript / batch o nazwie REPL.BAT, aby bardzo skutecznie wykonać swoje zadanie w jednym kroku. Polecenie REPL.BAT wykonuje wyszukiwanie wyrażenia regularnego / zamienia na standardowe wejście i zapisuje wynik na standardowe wyjście. Jest to czysty skrypt, który będzie działał na dowolnym komputerze z systemem Windows od XP.

type paste_here.txt | repl "^(.*?:.*?):.*" $1 >check.txt
dbenham
źródło