Como usar! em editar / substituir código em lote de loop

1

Estou tentando testar se uma linha contém uma sequência de texto com um loop for e, em seguida, remova essa sequência se ela estiver lá.

for /F "tokens=*" %%A in  (test.txt) do (
    echo %%A | findstr /C:"[B]" 1>nul
    if !errorlevel!==1 echo %%A
    if !errorlevel!==0 SOMEHOW REMOVE [B] AND ECHO IT WITHOUT THE B
    )

O problema é que o conceito a seguir não funciona dentro de um loop for:

set var=[B]Hello
set Va2r=%_var:[B]=%

E a substituição do % s por ! s parece não funcionar.

    
por Mark Deven 26.06.2018 / 15:03

1 resposta

3

Você precisa de delayedexpansion ao definir e usando uma variável dentro de um (bloco de código)

Isso gerará eat pontos de exclamação no seu texto.

:: Q:\Test18\SU_1334338.cmd
@Echo off & Setlocal EnableDelayedExpansion
for /F "tokens=*" %%A in  (test.txt) do (
    set "line=%%A"
    Echo=!line:[B]=!   
)

EDIT apenas para lembrar que o uso de for /f tem algumas armadilhas:

  • Processe o seguinte arquivo test.txt com o lote acima
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

Exemplo de saída:

> .\SU_1334338.cmd
This line contains [ B ]   here ::
this line is indented
there is an empty line following
:: this is the last line

Então o que aconteceu:

  • a substituição de [B] foi feita, mas
  • o recuo é perdido,
  • a linha vazia desapareceu
  • a linha que começa com o ponto e vírgula também.

Existe uma diferença entre "delims=" e "tokens=*"

  • ao definir o delimitador como nada, a linha inteira é processada inalterada.
  • usar todos os tokens (*) faz o que parece, mas o delimitador padrão Espaço na frente do primeiro token é removido (ou vários, pois são contados como um), então isso explica por que a indentação é removida.
  • a remoção de linhas vazias é um comportamento geral que pode ser contornado - com linhas numeradas - veja o próximo arquivo de lote
  • for /f suporta um characer end of line , que por padrão é o ponto-e-vírgula na primeira coluna. Se isso for um problema, defina um Eol= que provavelmente não interferirá no texto, como uma barra vertical |

Esse arquivo em lote, que não é muito diferente, evita as armadilhas listadas usando a localização com / V e o mais improvável de ocorrer string no texto e numera todas as linhas, portanto elas não estão vazias para for /f ; para remover o número, o delimitador é definido como ] , o que incorre no risco de que esse caractere na primeira coluna seja removido.

:: Q:\Test18\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(
)

Exemplo de saída:

> .\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
    
por 26.06.2018 / 15:22

Tags