linha de comando localizar / substituir ajuda

1

Eu tenho um conjunto de 5000+ arquivos que eu preciso fazer uma pesquisa simples e substituir. Eu tenho feito isso em um editor de texto (EditPlus), abrindo 500 arquivos de cada vez, fazendo uma pesquisa global / substitua, salve tudo, feche, etc. Mas, isso está levando literalmente horas para fazer e é chato e entediante e eu já fiz isso hoje e preciso fazer isso novamente porque todos os arquivos foram atualizados. Existe uma maneira de fazer isso através da linha de comando Bash? Aqui estão os detalhes:

Localizar onchange="document.location ='/products/view.html/view/'+this.value"

Substitua por onchange="alert('Not implemented')" style="display: none"

Todos os arquivos têm uma extensão .HTM, mas estão aninhados em vários subdiretórios.

EDIT - Estou em um Mac e preferiria uma solução baseada em * nix.

    
por Chris Bloom 10.01.2011 / 18:26

2 respostas

3

O comando base para o seu caso é assim:

sed -i 's|oldvalue|newvalue|g' file1 file2 file3

Se todos os seus arquivos estiverem no diretório ~/foo/bar/ , o que você deseja fazer é:

cd '~/foo/bar/'
find . -type f | xargs sed -i "" "s|onchange=\"document.location ='/products/view.html/view/'+this.value\"|onchange=\"alert\('Not implemented'\)\" style=\"display: none\"|g"

EDIT: o glob ( * como nome do arquivo) pode ser problemático com muitos arquivos e não entrar nos diretórios filhos. Neste caso, mude a última linha.

EDIT 2: com o BSD sed (usado no MacOS X) -i precisa de um argumento. BTW usando xargs . Graças a @Dennis Williamson

    
por 10.01.2011 / 18:33
2

Como o EditPlus é um editor do Windows, estou supondo que você deseja uma solução shell do Windows.

Você pode obter variantes de sed para o Windows, mas aqui está uma solução PowerShell que recursivamente localiza todos * .HTM arquivos, substitui "this" com "that", em seguida, salva o arquivo.

gci -Include *.HTM -Recurse | % {
  (gc $_) -replace "this","that" | sc -path $_ }

Usar suas strings torna as coisas um pouco mais torturadas, já que você incorporou aspas duplas e aspas simples, junto com os caracteres de expressões regulares. As aspas são escapadas com backticks (') e os caracteres regex com barras invertidas (\).

gci -Include temp*.HTM -Recurse | % {
  (gc $_) -replace "onchange='"document\.location '
  =''/products/view\.html/view/''\+this\.value",'
  "onchange='"alert(''Not implemented'')'" style='"display: '
  none'"" | sc -path $_ }

O Powershell está incluído no Windows 7 e pode ser baixado para o XP e acima.

Existe uma solução de arquivo único vbscript no StackOverflow eu postei em resposta a "Existe algum utilitário como sed para cmd.exe?" Essa pergunta contém muitas respostas com sugestões para soluções sed da linha de comando do Windows.

    
por 10.01.2011 / 19:34