Como usar o awk para localizar e substituir com o cálculo? [duplicado]

5

Eu tenho vários arquivos CSS em uma pasta que contém 0.2rem ou 0.5rem 0.6rem , agora eu quero que eles sejam todos divididos por 2, se tornem 0.1rem e 0.25rem, 0.3rem . Como posso usar awk ou sed ou gawk para realizar isso?

Eu tentei o seguinte comando, mas não tive sucesso:

find . -name "*.css" | xargs gawk -i inplace '{gsub(/([0-9\.]+)rem/, "(\1 * 0.5)rem"); print $0}'
    
por Zhang Buzz 14.03.2018 / 07:48

4 respostas

5
Solução

find + GNU awk :

find . -type f -name "*.css" -exec gawk -i inplace \
'{ for (i=1; i<=NF; i++) 
       if ($i ~ /^[0-9]+\.[0-9]+rem/) { v=$i/2; sub(/^[0-9]+\.[0-9]+/, "", $i); $i=v $i } 
 }1' {} \;
    
por 14.03.2018 / 08:00
7

Não tenho certeza sobre sed/gawk , mas aqui está uma com perl

$ echo '0.2rem or 0.5rem 0.6rem' | perl -pe 's/\d+(\.\d+)?(?=rem)/$&*0.5/ge'
0.1rem or 0.25rem 0.3rem
  • \d+(\.\d+)? correspondem a dígitos com parte fracionária opcional
    • (?=rem) para garantir que o número seja seguido por rem
  • $&*0.5 multiplica o número por 0.5 - o modificador e permite usar o código Perl em vez da sequência na seção de substituição


Aplicando aos arquivos:

find . -name "*.css" -exec perl -i -pe 's/\d+(\.\d+)?(?=rem)/$&*0.5/ge' {} +

Veja também: Por que o loop é sobre a má prática de saída do find

    
por 14.03.2018 / 07:58
4

Com gawk , você pode usar RS que é tratado como um regexp lá e o fato de que, RT contém o que foi correspondido por RS . Então:

find . -name '*.css' -type f -exec \
  gawk -i inplace -v RS='[0-9.]*[0-9]rem' -v ORS= 'RT{$0=$0 RT/2 "rem"};1' {} +
    
por 14.03.2018 / 23:09
1
gawk -i inplace '
{
    for(i = 1; i <= NF; i++) {
        if($i ~ /[0-9]+(\.[0-9]+)?rem/) 
            $i = $i / 2 "rem"            
    }
    print
}' file_*

O conteúdo de 3 arquivos antes da execução do programa

O comando tail -n +1 -- file_* mostra o conteúdo de vários arquivos de uma só vez.

$ tail -n +1 -- file_*

==> file_1 <==
0.2rem lorem ipsum 0.5rem
Lorem 0.2rem ipsum dolor sit amet, 0.5rem consectetur adipiscing elit magna aliqua.
Lorem ipsum 0.8rem dolor sit amet, 6rem consectetur 2rem adipiscing elit magna aliqua.
0.2rem lorem ipsum 0.5rem

==> file_2 <==
0.2rem lorem ipsum 0.5rem
Lorem 0.2rem ipsum dolor sit amet, 0.5rem consectetur adipiscing elit magna aliqua.
0.2rem lorem ipsum 0.5rem
Lorem ipsum 0.8rem dolor sit amet, 6rem consectetur 2rem adipiscing elit magna aliqua.

==> file_3 <==
0.2rem lorem ipsum 0.5rem
Lorem 0.2rem ipsum dolor sit amet, 0.5rem consectetur adipiscing elit magna aliqua.
Lorem ipsum 0.8rem dolor sit amet, 6rem consectetur 2rem adipiscing elit magna aliqua.

O conteúdo de 3 arquivos após a execução do programa

$ tail -n +1 -- file_*

==> file_1 <==
0.1rem lorem ipsum 0.25rem
Lorem 0.1rem ipsum dolor sit amet, 0.25rem consectetur adipiscing elit magna aliqua.
Lorem ipsum 0.4rem dolor sit amet, 3rem consectetur 1rem adipiscing elit magna aliqua.
0.1rem lorem ipsum 0.25rem

==> file_2 <==
0.1rem lorem ipsum 0.25rem
Lorem 0.1rem ipsum dolor sit amet, 0.25rem consectetur adipiscing elit magna aliqua.
0.1rem lorem ipsum 0.25rem
Lorem ipsum 0.4rem dolor sit amet, 3rem consectetur 1rem adipiscing elit magna aliqua.

==> file_3 <==
0.1rem lorem ipsum 0.25rem
Lorem 0.1rem ipsum dolor sit amet, 0.25rem consectetur adipiscing elit magna aliqua.
Lorem ipsum 0.4rem dolor sit amet, 3rem consectetur 1rem adipiscing elit magna aliqua.
    
por 14.03.2018 / 22:03

Tags