awk를 사용하여 찾고, 바꾸고, 계산하는 방법은 무엇입니까? [복사]

awk를 사용하여 찾고, 바꾸고, 계산하는 방법은 무엇입니까? [복사]

0.2rem폴더에 or 가 포함된 CSS 파일이 여러 개 있는데 이제 모두 2로 나누어 sum 이 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여기에 하나가 있습니다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현재 작업 디렉터리(as or)에서 확장 기능을 먼저 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.

관련 정보