Como posso substituir um caractere em todos os arquivos .php dentro de uma pasta no OS X?

1

Eu preciso substituir os seguintes caracteres:

ă com um

â com um

î com i

ș com s

ț com t

A substituição deve ser sensível a maiúsculas e minúsculas. Por exemplo, se uma letra é maiúscula, deve ser substituída por uma letra maiúscula.

Eu li que eu poderia usar sed para esse processo, mas não sei como usá-lo. Alguém pode me ajudar escrevendo o comando exato que devo executar no Terminal?

    
por Andrei 18.01.2016 / 16:09

4 respostas

3

Embora o sed seja comumente usado para esses tipos de tarefas, na verdade, ele não é projetado para eles - seu nome é stream editor.

A ferramenta projetada para edição não-interativa do arquivo é ex . ( vi é a forma "editor visual" de ex .) Particularmente quando você deseja editar arquivos no lugar, ex é uma ferramenta muito superior a sed .

Neste caso, os comandos usados são quase idênticos ao comando sed dado anteriormente, mas eles não precisam ser. O seguinte é compatível com POSIX (ao contrário de sed -i ).

for file in *.php; do ex -sc '%s/[ăâ]/a/ge | %s/ș/s/ge | %s/ț/t/ge | %s/î/i/ge | x' "$file" ; done

Explicação:

-s inicia o "modo silencioso" na preparação para o processamento em lote. -c especifica o (s) comando (s) a ser executado (s).

% significa aplicar o seguinte comando a todas as linhas do arquivo. Os comandos s/// são bastante autoexplicativos; A flag e no final significa que quaisquer erros (devido ao padrão não encontrado) são suprimidos e o processamento de arquivos continuará.

| é um separador de comando (não um pipe).

x informa ex para gravar quaisquer alterações no arquivo (mas somente se houver alterações ) e sair.

Se você deseja a edição de arquivos no local, ex é a ferramenta preferida. Se você quiser visualizar as alterações antes de criá-las, recomendamos usando tr como sugere @gardenhead.

(É claro que, se você estiver usando um sistema de controle de versão apropriado, como o git, poderá fazer as alterações usando ex e comparar os arquivos com a versão antiga executando git diff .)

    
por 18.01.2016 / 22:53
4

sed funcionará, mas isso é muito mais simples com tr , que traduz caracteres.

for file in *.php; do tr 'ăâîșțĂÂÎȘȚ' 'aaistaaist' < "${file}" > "translated_${file}"

O sed equivalente (que você precisará em sistemas GNU, não em OS / X, onde tr não suporta caracteres multibyte) seria:

sed 'y/ăâîșțĂÂÎȘȚ/aaistaaist/'
    
por 18.01.2016 / 22:27
1

Você pode substituir os caracteres usando a fórmula sed s/old_string/new_string/ .

Da página de manual:

sed - stream editor for filtering and transforming text

s/regexp/replacement/
              Attempt to match regexp against the pattern space.  If successful, replace that  portion  matched  with
              replacement.   The replacement may contain the special character & to refer to that portion of the pat‐
              tern space which matched, and the special escapes  through  to refer to the corresponding  matching
              sub-expressions in the regexp.

Se você tiver definido caracteres para substituir, recomendo criar um arquivo (por exemplo, replace.sed ) contendo a definição de substituição da seguinte forma:

$ cat replace.sed
s/ă/a/g
s/â/a/g
s/î/i/g
s/ș/s/g
s/ț/t/g

E então, você pode executar da seguinte forma:

  • sed -f replace.sed < old.php > new.php

    Que substituem os caracteres especificados em replace.sed por novos, de old.php e saída para new.php

  • sed -i -f replace.sed file.php

    Que substituem file.php substituindo simultaneamente os caracteres especificados em replace.sed

    Da página de manual:

    -i[SUFFIX], --in-place[=SUFFIX]
    
                  edit files in place (makes backup if SUFFIX supplied)
    

Ou você pode definir simultaneamente em uma linha como:

sed -e 's/ă/a/g' -e 's/â/a/g' -e 's/î/i/g' -e 's/ș/s/g' -e 's/ț/t/g'

Para fazer esta operação para todos os arquivos .php , você pode usar algo como:

  • find . -name "*.php" -exec sed -i '' -f replace.sed '{}' \;
  • for i in *.php; do sed -i '' -f replace.sed "$i"; done

Nota: use -maxdepth 1 com find para limitar a localização de *.php apenas no diretório atual. Visite man sed para obter mais informações.

    
por 18.01.2016 / 16:43
0

Se preferir uma ferramenta GUI, você pode tentar jEdit . Possui excelente funcionalidade de pesquisa e substituição, incluindo pesquisa de pastas (diretório). Você pode usar expressões regulares, se quiser. Hypersearch aparece em uma janela separada com os resultados.

    
por 19.01.2016 / 13:49