Potrzebujesz opóźniona ekspansja podczas ustawiania i użycie zmiennej wewnątrz a (bloku kodu)
To będzie eat
wykrzykniki w tekście.
:: Q:\Test\2018\06\26\SU_1334338.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=*" %%A in (test.txt) do (
set "line=%%A"
Echo=!line:[B]=!
)
EDYTUJ, aby przypomnieć, że korzystanie z for /f
ma pewne pułapki:
- Przetwórz następujący plik
test.txt
z powyższą partią
This line contains [ B ] here :[B]:
this line is indented
there is an empty line following
; this line starts with a ;
:: this is the last line
Przykładowe wyjście:
> .\SU_1334338.cmd
This line contains [ B ] here ::
this line is indented
there is an empty line following
:: this is the last line
Więc co się stało:
- dokonano wymiany [B], ale
- wcięcie jest stracone,
- pusta linia zniknęła
- linia zaczynająca się od średnika również.
Istnieje różnica między używaniem "delims="
i "tokens=*"
- podczas ustawiania ogranicznika na nic cała linia jest przetwarzana bez zmian.
- użycie wszystkich tokenów (*) robi to, co brzmi, ale domyślny ogranicznik Przestrzeń przed pierwszym żetonem jest usuwany (lub wielokrotny, ponieważ są liczone jako jeden), więc wyjaśnia to, dlaczego wcięcie jest usuwane.
- usunięcie pustych linii to ogólne zachowanie, które można obejść - z numerowanymi liniami - patrz następny plik wsadowy
for /f
obsługuje jeden end of line
znak, który domyślnie jest średnikiem w pierwszej kolumnie. Jeśli jest to problem, zdefiniuj Eol=
które najprawdopodobniej nie będą kolidować z tekstem, jak pionowy pasek |
Ten niezbyt różny plik wsadowy unika wymienionych pułapek, używając find z / V i najbardziej mało prawdopodobnego wystąpienia ciągu w tekście i numeruje wszystkie linie, więc nie są puste for /f
; aby usunąć liczbę ustawioną przez separator ]
co pociąga za sobą ryzyko, że ten znak w pierwszej kolumnie (ach) również zostanie usunięty.
:: Q:\Test\2018\06\26\SU_1334338_2.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=1* eol=|delims=]" %%A in (
'find /N /V "#+§-*;" ^< test.txt'
) do (
set "line=%%B"
if defined line (Echo(!line:[B]=!) else Echo(
)
Przykładowe wyjście:
> .\SU_1334338_2.cmd
This line contains [ B ] here ::
this line is indented
there is an empty line following
; this line starts with a ;
:: this is the last line