Eu tenho um arquivo de texto com essas 3 linhas:
This line contains foo.
This line contains bar.
This line has neither.
Eu posso executar o comando abaixo em um arquivo ".bat" (ao lado do arquivo ".txt" acima) e ele remove todas as linhas do arquivo de texto, exceto as linhas que contêm "foo":
Powershell.exe -Command "gci *.txt | foreach { (cat $_.FullName | ? { $_ -like '*foo*' }) | set-content $_.FullName}"
Executando que tenha o efeito pretendido, deixando apenas esta linha no arquivo de texto:
This line contains foo.
Agora o problema: E se eu quiser manter linhas que tenham "foo" e "bar" na linha?
Devo ter tentado provavelmente 40 ou 50 combinações diferentes até agora, colocando um caractere pipe: *foo*|*bar*
, tirando os asteriscos foo|bar
, colocando asteriscos apenas no início e no final: *foo|bar*
, usando uma vírgula, não usando uma vírgula, usando um ponto e vírgula, não usar ponto e vírgula, duplicar o -like
comando com e sem $_
e muitas outras maneiras.
Nada funciona - em todas as tentativas até agora, acabei com o arquivo de texto com a mesma aparência, com as três linhas originais contendo foo (linha 1), bar (linha 2) e nenhum (linha 3).
Para ter certeza de que não estou editando o comando e cometendo um erro, estou periodicamente removendo minhas edições e executando o comando novamente para apenas tirar linhas sem "foo" na linha e funciona, ou apenas colo o comando novamente, teste-o novamente e comece a tentar editá-lo para incluir "bar", sem sucesso.
Eu já fiz essa pergunta recentemente, mas acho que minha redação do título não foi clara. Alguém tentou responder, mas todas as respostas que forneceram não funcionaram, pelo menos quando estou colocando o comando em um arquivo em lotes e executando-o ao lado do arquivo de texto, talvez esteja funcionando para eles, usando um método diferente para o que eu sou, eu não sei.
Observe que estou usando um comando powershell em um arquivo de lote! Não estou digitando em um console ou usando scripts ps1. Eu não preciso fazer nada disso, porque o primeiro comando que mencionei acima funciona para remover todas as linhas com "foo".
Obviamente, como isso funciona, o comando pode ser usado como base para adicionar, para que possa lidar com "foo" e "bar" em um único comando.
A menos, é claro, que isso seja 100% impossível - o que depois de cerca de 4 dias tentando 40 ou 50 variações diferentes no comando - é o que estou começando a suspeitar!
Por favor, se alguém responder isso, poste um comando de arquivo em lote como eu fiz acima. Por favor, não me diga para passar a usar scripts ps1 ou dar respostas que estão explicando o que digitar em uma janela do console.
O comando que postei acima simplesmente precisa de algum tipo de alteração para que "bar" possa ser adicionado a "foo", para que ele lide com mais de uma string de texto.
A razão pela qual isso é tão difícil parece ser porque se você executar um comando para remover todas as linhas, exceto aquelas com "foo", você já retirou as linhas com "bar". Eu suspeito que é por isso que ninguém chegou a uma solução de trabalho ainda e talvez simplesmente não haja uma.
Desde já agradeço a quem tiver uma resposta funcional. Normalmente, essas coisas são respondidas aqui muito rápido, ou eu continuo tentando maneiras diferentes e faço funcionar - mas não desta vez, isso é muito difícil por algum motivo.
Basta usar duas condições separadas unidas com OR:
Parênteses podem ser usados para adicionar clareza, mas são opcionais:
Esses são literalmente a mesma coisa. Não importa como você invoca um script do PowerShell – seja armazenado em um arquivo ou passado pela linha de comando ou inserido pelo teclado, ainda é um script do PowerShell e segue as mesmas regras de sintaxe.
Você pode usar
select-string
em vez disso, que usa expressões regulares:select-string
permite que você execute uma correspondência de expressão regular mais complicada daqui para frente, se necessário.Leitura adicional