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' {} \;
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}'
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
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' {} +
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.
Tags awk