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

Aziz
fonte
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

barlop
fonte
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

user2005187
fonte
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 ++).

Ian Pugsley
fonte
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

Sergius
fonte
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
p0rkjello
fonte
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.

dbenham
fonte
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'.

JRobert
fonte
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.

Dom
fonte