Script em lote para encontrar a última palavra na linha específica

1

Eu tenho um arquivo de texto que contém 2 linhas de uma frase. No final da segunda linha, tenho uma palavra que diz Alive . Pode ser Alive ou Down.

Agora eu tenho que escrever uma instrução IF de tal forma que se o arquivo de texto contiver Alive, ele deve imprimir Hi else, ele deve imprimir Hello . Isso precisa ser feito usando o arquivo em lotes.

    
por user284262 24.12.2013 / 07:50

1 resposta

2

@echo off
findstr /N . input.txt | findstr /I ^2.*alive$ > NUL    
IF %ERRORLEVEL% EQU 0 (Echo Hi) ELSE (Echo Hello)
pause

Esse lote lê seu arquivo de texto com a opção /N , que coloca um número na frente de cada linha, como:

1:This is a test,
2:and I am alive
3:Not?

O novo texto é canalizado para o segundo findstr , que usa o padrão RegEx ^2.*alive$ para encontrar uma linha que começa com 2 e termina com alive . Essa foi a parte difícil.

Como findstr define seu nível de erro como 0 se pelo menos uma correspondência for encontrada, podemos usar uma instrução IF simples para ecoar "Hi" ou "Hello".

Lote em detalhes

  • findstr procura por strings em arquivos
  • /N coloca um número de linha na frente de cada linha
  • . é um curinga para qualquer caractere único. Ele diz findstr para procurar por tudo
  • | é o comando do canal. A saída do primeiro comando é passada como entrada para o segundo
  • /I diz a findstr para pesquisar sem distinção entre maiúsculas e minúsculas, pelo que "Alive" e "alive" são ambos encontrados
  • ^ é um termo RegEx e representa uma linha que começa
  • .* é um termo RegEx e representa um número indefinido de caracteres
  • $ é um termo RegEx e representa uma linha que termina
  • > NUL oculta a saída findstr para que a linha correspondente não seja exibida na janela do CMD
  • IF condition (command) ELSE (command) é uma condição IF simples
  • %ERRORLEVEL% EQU 0 é o código de saída do findstr. "EQU" significa "equel"

Editar ( exemplo tirado do comentário do OP abaixo)

  1. Seu"Vivo" não está na segunda linha. É o quinto
  2. Depois de "Alive", existem três espaços no seu exemplo, por isso alive$ não corresponde a

    Altere ^2.*alive$ para 5.*alive . Ou melhor ainda ^5.* Alive $
    Observe os espaços.

por 24.12.2013 / 08:38