awkを使って検索、置換、計算する方法は? [コピー]

awkを使って検索、置換、計算する方法は? [コピー]

0.2remフォルダにorが含まれているCSSファイルがいくつかあります0.5rem 0.6rem。これをどのように使用または達成できますか?0.1rem0.25rem, 0.3remawksedgawk

私は成功せず、次のコマンドを試しました。

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

答え1

わかりませんが、sed/gawkここに1つあります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+)?オプションの小数部と数値の一致
    • (?=rem)後ろに数字があることを確認してください。rem
  • $&*0.5数値の乗算0.5-e修飾子を使用すると、置換部分に文字列の代わりにPerlコードを使用できます。


ファイルに適用されます。

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

また見なさい:検索結果を繰り返すのはなぜ悪い習慣ですか?

答え2

find+GNUawk解決策:

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' {} \;

答え3

の場合正規表現だと思えgawkばいいし、実際にはそこに一致するものがあります。だから:RSRTRS

find . -name '*.css' -type f -exec \
  gawk -i /usr/share/awk/inplace.awk -v RS='[0-9.]*[0-9]rem' -v ORS= 'RT{$0=$0 RT/2 "rem"};1' {} +

使用しないでください-i inplace現在の作業ディレクトリから最初に拡張機能をgawkロードしようとすると、誰かがそのディレクトリにマルウェアを植えた可能性があります。システムに付属の拡張プログラムのパスは異なる場合があります。出力を参照してください。inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

答え4

gawk -i inplace '
{
    for(i = 1; i <= NF; i++) {
        if($i ~ /[0-9]+(\.[0-9]+)?rem/) 
            $i = $i / 2 "rem"            
    }
    print
}' file_*

プログラム実行前の3つのファイルの内容

このtail -n +1 -- file_*コマンドは、複数のファイルの内容を一度に表示します。

$ 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.

プログラム実行後の3つのファイルの内容

$ 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.

関連情報