Substitua um grande número de arquivos de acordo com o guia de estilo

2

Eu gostaria de fazer uma reformatação de nossos testes por atacado, e estou limpando algumas letras maiúsculas inconsistentes. Estou pensando em usar awk para fazer isso, já que sed cai um pouco, e desde que eu preciso olhar para o meu caso. Especificamente, para cada linha em um determinado arquivo, quero que o seguinte aconteça:

  • Procure a palavra it , describe ou context , seguida de um espaço, seguido de uma aspa simples ou dupla, seguida de um caractere alfabético maiúsculo.

  • Se houver uma correspondência, substitua a correspondência pela versão em minúsculas de toda a string correspondente, mas apenas pela string correspondente (não diminua o tamanho de outras coisas na mesma linha).

  • Não combine se a string após a aspa simples ou dupla for uma das opções "GET", "POST", "PUT" ou "DELETE".

Então, por exemplo:

describe 'apple banana'       ----> (no change)
describe 'APPLE BANANA'       ----> describe 'aPPLE BANANA'
describe 'Apple Banana'       ----> describe 'apple Banana'
describe "Apple Banana"       ----> describe "apple Banana"
describe 'one TWO'            ----> (no change)

context 'POST BANANA'         ----> (no change)
context 'XPOST BANANA'        ----> context 'xPOST BANANA'

Quais argumentos awk e / ou outros comandos devo usar? (Tudo bem se eu precisar de mais de um passe para fazê-lo.)

    
por John Feminella 01.10.2012 / 18:35

1 resposta

3

EXCLUSÃO DE RESPONSABILIDADE:

Esta solução removerá todos os espaços em branco "extras" nas linhas substituídas. Por exemplo ...:

      describe           'Apple           Banana'

... será substituído por:

 describe 'apple Banana'

No entanto, os espaços em branco "extras" em ...:

            context      "GET  BANANA"

... não será removido.

Aqui está um exemplo em awk conforme solicitado (observe que você pode executar o comando em uma linha. As quebras de linha são apenas para apelo visual aqui no Superusuário):

cat someTextFile.txt | awk '{ \
    if( \
        ($1=="describe" || $1=="it" || $1=="context") \
         && (substr($2,0,1)=="\"" || substr($2,0,1)=="'"'"'") \
         && !(substr($2,2,length($2)-1)=="POST" \
              || substr($2,2,length($2)-1)=="GET" \
              || substr($2,2,length($2)-1)=="PUT" \
              || substr($2,2,length($2)-1)=="DELETE") \
       ){ \
          subStr=substr($2,0,1); \
          subStr2=tolower(substr($2,2,1)); \
          restStr=substr($2,3,length($2)-1); \
          print $1" "subStr""subStr2""restStr" "$3 \
        }else{ \
          print \
        } \
     }' 

OUTPUT :

 describe 'apple banana'
 describe 'aPPLE BANANA'
 describe 'apple Banana'
 describe "apple Banana"
 describe 'one TWO'

 context 'POST BANANA'
 context 'xPOST BANANA'

EDIT: aqui está o comando sem as quebras de linha cat someTextFile.txt | awk '{ if( ($1=="describe" || $1=="it" || $1=="context") && (substr($2,0,1)=="\"" || substr($2,0,1)=="'"'"'") && !(substr($2,2,length($2)-1)=="POST" || substr($2,2,length($2)-1)=="GET" || substr($2,2,length($2)-1)=="PUT" || substr($2,2,length($2)-1)=="DELETE") ){ subStr=substr($2,0,1); subStr2=tolower(substr($2,2,1)); restStr=substr($2,3,length($2)-1); print $1" "subStr""subStr2""restStr" "$3}else{print}}'

Se você deseja gravar a saída em um novo arquivo, basta adicionar > output.txt no final do comando.

Se você deseja executar isso em vários arquivos e armazenar o resultado em um arquivo de texto, simplesmente troque cat someFile.txt por um comando cat que é executado nos arquivos que você deseja que sejam formatados. com cat *log* ou cat $(find /some/path -name "*log*")

EDIT EDIT: Muito obrigado Scott pelo feedback!

    
por 01.10.2012 / 20:01