Вам нужно задержать расширение при установке и использовании переменной внутри (блок кода)
Это будет eat
восклицательные знаки в вашем тексте.
:: 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]=!
)
ПРАВКА, чтобы напомнить, что использование for /f
имеет некоторые подводные камни:
- Обработайте следующий файл
test.txt
с вышеуказанным пакетом
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
Образец вывода:
> .\SU_1334338.cmd
This line contains [ B ] here ::
this line is indented
there is an empty line following
:: this is the last line
Так что же случилось:
- замена [B] была сделана, но
- отступ потерян,
- пустая строка исчезла
- строка, начинающаяся с точки с запятой также.
Существует различие между использованием "delims="
и "tokens=*"
- при установке разделителя на ноль вся строка обрабатывается без изменений.
- использование всех токенов (*) делает то, на что это похоже, но разделитель по умолчанию Пробел перед первым токеном удаляется (или несколько, так как они считаются одним), поэтому это объясняет, почему отступ удаляется.
- удаление пустых строк - это общее поведение, которое можно обойти - с нумерованными строками - см. следующий пакетный файл
for /f
поддерживает символ end of line
который по умолчанию является точкой с запятой в самом первом столбце. Если это проблема, определите Eol=
который, скорее всего, не будет мешать тексту, как вертикальная черта |
Этот, не сильно отличающийся, пакетный файл позволяет избежать перечисленных ловушек с использованием команды find с /V и наиболее маловероятной строки в тексте и нумерует все строки, поэтому они не пусты для for /f
; чтобы удалить число, в котором установлен разделитель ]
возникает риск, что этот символ в первом столбце (столбцах) также будет удален.
:: 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(
)
Образец вывода:
> .\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