Regex substituir da linha de comando


21

É possível regex substituir a partir da linha de comando? No momento, estou usando o bloco de notas ++ para fazer isso. Na linha de comando, só posso usar o FINDSTR, que só pode localizar os arquivos / linhas mached.

EDIT:
Talvez seja possível criar um script VB e executá-lo a partir do cmd? Acabei de criar um arquivo "hi.vbs" com o conteúdo

Msgbox "Hi Buddy"

Em seguida, o cmd me permite executá-lo diretamente, digitando "oi" na linha de comando.
Portanto, se não for possível com o script em lote, eu posso usar um script VB através de lote. Ou..?


No final, você coloca uma frase inconclusiva e toda a parte da edição não está apontando para o problema é mais como "Eu crio um olá mundo em vb, posso criar algo assim no lote? Verifique a resposta postada por @IanPugsley maneira fácil de fazer regex substituir.
— mjsr

@ Aziz: alguma dessas respostas funcionou para você? Se sim, você aceitaria esse? Isso faz parte da participação nesta comunidade; a maneira como agradecemos um ao outro pela ajuda. Os pontos de reputação dados para uma resposta aceita ajudam outros usuários a avaliar a experiência um do outro. Obrigado.
— JRobert # 29/11

Eu estava pensando em chamar algo como MYVBREPLACE (.vbs) SUBSTITUIÇÃO REGEXPATTERN DE FILENAME na linha de comando.
— Aziz

Respostas:


11

vá aqui
http://gnuwin32.sourceforge.net/packages.html
role para baixo até o SED. Baixe coreutils também enquanto você está nisso.

esse comando substituirá a por b globalmente e em cada linha. portanto, não apenas a primeira ocorrência na linha.

por exemplo, usando sed "s / a / b / g" a.txt

C:\>type a.txt
aaaa
aaa

C:\>sed "s/a/b/" a.txt
baaa
baa

C:\>sed "s/a/b/g" a.txt
bbbb
bbb

C:\>

O VBScript suporta expressões regulares, você pode encontrar e substituir por ele.

dim re, s
set re = new RegExp

re.Pattern="in"
re.Global=True 'false is default
s="bin din in"
MsgBox re.Replace(s,"xxx")

Exibe bxxx dxxx xxx


Ferramenta louca incrível !!! Essa ferramenta foi muito avançada. Ainda não consegui usá-lo, mas quando li gnu.org/software/sed/manual/sed.html#The-_0022s_0022-Command , vejo que isso pode fazer muito mais do que eu poderia esperar. Muito obrigado
— Aziz

Novas versões do bash também podem fazer expressões regulares, às vezes isso é suficiente para tarefas simples e não há necessidade de usar nem o sed.
— vtest

e re o que o vtest disse, caso alguém não saiba. cygwin tem festança.
— barlop

sed suga com substitui com ramal embora
— kofifus

1
@KennyEvitt cmd shell requer um ajuste para obtê-lo para exibir e uso de chcp para unicode utf8 chcp 65001 (como você diz, UTF16 encoding.chcp 1200 e chcp 12001 não é suportado) stackoverflow.com/questions/9321419/... Não tenho certeza re hortelã. Não tenho certeza sobre o PowerShell. Mas o utf-8 é suportado ok no cmd ou powershell. Contanto que uma fonte de suporte seja usada como courier new e a página de código 65001. Existe um cmd / u para uma codificação utf16.
— barlop

26

Eu escrevi uma ferramenta de linha de comando gratuita para o Windows fazer isso. É chamado rxrepl , suporta Unicode e pesquisa de arquivos. Alguns podem achar uma ferramenta útil.

O rxrepl é uma ferramenta de linha de comando do Microsoft Windows para pesquisar e substituir texto em arquivos de texto usando expressões regulares compatíveis com Perl (PCRE).

Possui os seguintes recursos:

  • Pesquisa usando expressões regulares compatíveis com Perl
  • Usar correspondência de grupo no texto de substituição
  • Suporta terminações de linha Windows e Unix
  • Suporte Unicode
  • Aceita vários argumentos de pesquisa / substituição
  • As opções podem ser fornecidas em um arquivo de opções
  • Procurar arquivos
  • Modo de pré-visualização
  • Modos de correspondência de linha e arquivo completo

insira a descrição da imagem aqui


4
Isso é incrível! Se você é como eu e precisa de exemplos, isso substitui "foobar" por "foofighters" em um arquivo: rxrepl.exe -f file.txt -a -s "(foo) bar" -r "\ 1fighters"
— Dunc

1
Além disso, você teria a fonte em algo como o github? Totalmente compreensível se não for para ser de código aberto, mas estou muito curioso.
— precisa saber é o seguinte

1
@Steztric Realmente? Estou executando o Windows de 64 bits e parecem não ter problemas executando issoC:\WINDOWS\System32\cmd.exe
— kayleeFrye_onDeck

1
Ferramenta incrível! Executando sem problemas no Windows Server Std 2012 R2 x64. THX!
— kwrl

2
Grande ferramenta, eu espero que você ainda está mantendo-lo
— aguado

12

A equipe de scripts aborda como fazer isso no PowerShell (sem downloads adicionais nos sistemas operacionais Windows mais recentes, você provavelmente já o instalou).

Inicie, execute o seguinte (para substituir um *por um @):

(Get-Content C:\Scripts\Test.txt) | 
Foreach-Object {$_ -replace "\*", "@"} | 
Set-Content C:\Scripts\Test.txt

Isso suporta expressões regulares do .NET , incluindo observações positivas e negativas, e todo tipo de coisa que o bloco de notas ++ não suportava com regex antes da versão 6.x (tanto quanto eu amo o bloco de notas ++).


1
Notepad ++ suporta PCRE completo a partir da versão 6.
— Bob

5

Eu encontrei o fnr.exe para isso. Possui interface gráfica e linha de comando.

Uma ferramenta de código aberto para localizar e substituir texto em vários arquivos.

Recursos

  • Download de um único arquivo - fnr.exe (127kb)
  • Substituir texto em vários arquivos usando o aplicativo Windows ou através da linha de comando
  • Localizar Apenas para ver onde as correspondências são encontradas
  • Pesquisa com distinção entre maiúsculas e minúsculas
  • Procurando arquivos em um diretório ou subdiretórios recorrentes
  • Expressões regulares
  • Encontre e substitua texto com várias linhas
  • Gerar botão de linha de comando para criar texto de linha de comando para colocar no arquivo em lotes
  • Ajuda da linha de comando
  • Testes de unidade do mecanismo Localizar / Substituir

Visualizando opções de linha de comando

insira a descrição da imagem aqui


1
Muito bom - você pode verificar sua declaração "find" na GUI, clicar em "Gen Replace Command Line" e se preparar para usar a chamada de linha de comando. Não é necessário gastar tempo para se familiarizar com a sintaxe da linha de comando.
— 21415 sarh

Não consegui fazer isso sair depois de fazer as alterações. Eu tenho que pressionar enter para fechar, tornando isso não especialmente útil para scripts
— G-.

@ G-. Não há espera para <enter> se for executado a partir de um arquivo em lotes.
— Sergius 11/01

Eu não poderia encontrar uma maneira de saída para um nome diferente / extensão
— Rick

4

Parece que você pode usar regex com FINDSTR

findstr [Windows CMD] :

O findstr permite procurar texto (conforme especificado com o padrão no arquivo file-name. Se o nome do arquivo contiver caracteres curinga (* ou?), ele procurará em todos os arquivos correspondentes. A opção / S pesquisa no diretório atual e também em seus subdiretórios. Se o padrão contiver espaços, ele deverá ser especificado como / C: "algum texto a ser pesquisado". Para transformar o padrão em expressões regulares, a opção / R deve ser usada. A opção / I pesquisa caso insensível.

Na Ajuda do FindStr ( Findstr /?):

/ R - usa cadeias de pesquisa como expressões regulares.

Regular expression quick reference:
  .        Wildcard: any character
  *        Repeat: zero or more occurrences of previous character or class
  ^        Line position: beginning of line
  $        Line position: end of line
  [class]  Character class: any one character in set
  [^class] Inverse class: any one character not in set
  [x-y]    Range: any characters within the specified range
  \x       Escape: literal use of metacharacter x
  \<xyz    Word position: beginning of word
  xyz\>    Word position: end of word

Obrigado por sua resposta, mas essa não foi minha pergunta.
— Aziz

2
findstrnão pode substituir texto em arquivos!
— 21917 Kenny Evitt

4

Estou um pouco atrasado para a festa, mas o JREPL.BAT é um utilitário regex baseado em scripts em lote / JScript / híbrido que roda nativamente em qualquer máquina Windows a partir do XP.

A documentação completa está embutida no script, que pode ser acessado via JREPL /?ou usado JREPL /??para saída paginada.

O JREPL usa o regex ECMA padrão que acompanha o JScript. O regex ECMA não é tão poderoso quanto o regex .NET disponível para o PowerShell, mas ainda é muito bom. E acho que o usuário médio encontrará esse utilitário mais fácil de usar do que o PowerShell.

As opções integradas do JREPL já fornecem muita energia inerente, mas a capacidade de injetar o JScript fornecido pelo usuário realmente abre possibilidades surpreendentes.

Desenvolvi o script porque meu local de trabalho não permite o download de arquivos exe fora do padrão, mas não tem restrições na gravação de scripts em lote ou JScript :-)

Simplesmente siga o link e copie o código do script em um arquivo chamado JREPL.BAT. Leia as postagens subseqüentes desse segmento para obter exemplos de histórico de uso e desenvolvimento. Há também muitas respostas StackOverflow que usam JREPL.BAT.


3

Duas boas opções são o Cygwin, que fornecerá um ambiente semelhante ao Unix, semelhante ao bash (alternativa ao cmd.exe); e Unxutils , portas Win32 de uma coleção de utilitários Unix individuais. Nos dois pacotes, consulte 'sed', 'awk' e 'grep'.


2
unxutils é velho. agora a coisa é gnuwin32
— barlop 04/10

Obrigado JRobert por sua sugestão. Lamento não ter entendido, mas agora vejo que o SED era o problema.
— Aziz

@barlop a partir de 2018, o gnuwin32 agora também é antigo. O cygwin está mais atualizado!
— barlop

0

Você também pode usar o GSAR para executar a pesquisa e a substituição da linha de comandos. Funciona com hexadecimal e binário também. Ele não fará o trabalho pesado e complexo que o regex pode executar, mas, para pesquisa e substituição básicas, ele realiza o trabalho com rapidez e facilidade.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.