AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / computer / Perguntas / 1666758
Accepted
bat_cmd
bat_cmd
Asked: 2021-08-01 03:01:07 +0800 CST2021-08-01 03:01:07 +0800 CST 2021-08-01 03:01:07 +0800 CST

Comando Powershell no arquivo de lote: Remova todas as linhas do arquivo de texto, exceto as linhas com "foo" e "bar"?

  • 772

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 -likecomando 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.

windows command-line
  • 2 2 respostas
  • 599 Views

2 respostas

  • Voted
  1. Best Answer
    user1686
    2021-08-01T03:11:03+08:002021-08-01T03:11:03+08:00

    Basta usar duas condições separadas unidas com OR:

    cat $_.FullName | ? { $_ -like '*foo*' -or $_ -like '*bar*' }
    

    Parênteses podem ser usados ​​para adicionar clareza, mas são opcionais:

    { ($_ -like '*foo*') -or ($_ -like '*bar*') }
    

    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.

    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.

    • 5
  2. DavidPostill
    2021-08-01T04:15:19+08:002021-08-01T04:15:19+08:00

    Você pode usar select-stringem vez disso, que usa expressões regulares:

    gci *.txt | % { (cat $_.FullName | select-string -pattern 'foo|bar') | set-content $_.FullName -Force }
    

    select-stringpermite que você execute uma correspondência de expressão regular mais complicada daqui para frente, se necessário.


    Leitura adicional

    • Expressões Regulares - PowerShell - SS64.com
    • Select-String - PowerShell - SS64.com
    • 2

relate perguntas

  • Qual seria o equivalente em lote do argumento "pass" do Python?

  • Não é possível ativar o Microsoft Print to PDF depois de desativado

  • Comunique-se com o daemon do Docker no Windows

  • atalho do shell da área de trabalho no painel lateral do explorer

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como posso reduzir o consumo do processo `vmmem`?

    • 11 respostas
  • Marko Smith

    Baixar vídeo do Microsoft Stream

    • 4 respostas
  • Marko Smith

    O Google Chrome DevTools falhou ao analisar o SourceMap: chrome-extension

    • 6 respostas
  • Marko Smith

    O visualizador de fotos do Windows não pode ser executado porque não há memória suficiente?

    • 5 respostas
  • Marko Smith

    Como faço para ativar o WindowsXP agora que o suporte acabou?

    • 6 respostas
  • Marko Smith

    Área de trabalho remota congelando intermitentemente

    • 7 respostas
  • Marko Smith

    O que significa ter uma máscara de sub-rede /32?

    • 6 respostas
  • Marko Smith

    Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows?

    • 1 respostas
  • Marko Smith

    O VirtualBox falha ao iniciar com VERR_NEM_VM_CREATE_FAILED

    • 8 respostas
  • Marko Smith

    Os aplicativos não aparecem nas configurações de privacidade da câmera e do microfone no MacBook

    • 5 respostas
  • Martin Hope
    Saaru Lindestøkke Por que os arquivos tar.xz são 15x menores ao usar a biblioteca tar do Python em comparação com o tar do macOS? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh Como posso reduzir o consumo do processo `vmmem`? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Pesquisa do Windows 10 não está carregando, mostrando janela em branco 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 Por que uma conexão de Internet gigabit/s via cabo (coaxial) não oferece velocidades simétricas como fibra? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 Área de trabalho remota congelando intermitentemente 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney Por que colocar um ponto após o URL remove as informações de login? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension Ponteiro do mouse movendo-se nas teclas de seta pressionadas no Windows? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca Todos os meus complementos do Firefox foram desativados repentinamente, como posso reativá-los? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK É possível criar um código QR usando texto? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 Altere o nome da ramificação padrão do git init 2019-04-01 06:16:56 +0800 CST

Hot tag

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve