프로필의 전환 가치를 매일 +1씩 늘립니다.

프로필의 전환 가치를 매일 +1씩 늘립니다.

매일 추가해야 하는 구성 파일이 있습니다.

예를 들어

report.lookback.days.to.retrieve.data=60

파일에는 다른 값을 포함하는 위의 항목과 같이 여러 항목이 포함되어 있습니다. 속성 파일을 열고 이 특정 항목을 검색한 후 총 30일 동안 매일 +1씩 값을 늘려야 합니다.

예를 들어

report.lookback.days.to.retrieve.data=61

report.lookback.days.to.retrieve.data=62

report.lookback.days.to.retrieve.data=63

저는 스크립팅을 처음 접했고 이 작업을 수행하는 데 어떤 방법을 사용할 수 있는지 잘 모르겠습니다.

awk, sed, 카운터 구현 또는 메소드 조합을 사용해야 합니까?

답변1

자신이 게시한 것과 유사한 파일만 편집하려면 다음과 같은 방법을 사용하세요.

perl -i  -pe 's/report.lookback.days.to.retrieve.data=\K\d+/$&+1/e' file

설명하다

-i내부 편집을 활성화하여 변경 사항이 원본 파일에 저장됩니다. -p즉, "-e로 지정된 스크립트를 실행한 후 각 줄을 인쇄합니다"/

s///대체 연산자이며 다음과 같이 작동합니다 s/source/replacement.

report.lookback.days.to.retrieve.data=사용되는 정규식은 문자열( \d+) 뒤에 하나 이상의 숫자가 오는 것을 찾는 것입니다. \K이전 일치 항목을 삭제하고 $&(방금 일치한 항목을 보유하는 특수 변수) 숫자만 가리킬 수 있도록 허용합니다.

$&+1마지막으로 일치하는 값에 1을 더한 으로 바꿉니다 . 이것( s///평가 연산자 내부의 것)은 s///e끝에 있는 플래그에 의해 활성화 됩니다 s///e.

답변2

매일 그 자리에서 파일을 편집하려는 경우(아마도 원하지 않을 경우) 다음을 수행할 수 있습니다.

$ echo 'report.lookback.days.to.retrieve.data=61' \
    | awk -F= '
        /report.lookback.days.to.retrieve.data/{
            printf("%s=%d\n", $1, $2+1)
        }
    '
report.lookback.days.to.retrieve.data=62

하지만 이렇게 하려면 임시 파일에 저장한 다음 매번 원본 파일을 바꿔야 합니다. 앞서 언급했듯이 값을 로 바꾸고 스크립트를 매개변수로 호출하는 devnull것이 좋습니다 .$vars

답변3

를 사용하여 이 작업을 수행하는 것은 매우 간단 awk하지만 표준 방법은 임시 파일로 출력한 다음 원본 파일을 바꾸는 것입니다. Linux에서는 다음과 같이 mktemp할 수 있습니다.

tempfile=$(mktemp --tmpdir=.)
awk -F= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file >"$tempfile"
mv "$tempfile" in_file

일부 버전에는 (내부) 옵션이 awk있습니다 . 즉, 다음을 수행할 수 있습니다.-i

awk -iF= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file

또는 sponge유틸리티(섹션더 많은 유틸리티) 사용 가능:

awk -F= '{
  if($1=="report.lookback.days.to.retrieve.data")
    print $1"="$2+1
  else
    print
  }' in_file |
sponge in_file

물론 , 입력 파일에 추가하려는 줄 외에 다른 줄이 포함되어 있지 않은 경우(또는 포함되어 있고 해당 줄을 제거하려는 경우) awk이 부분을 단순화할 수 있습니다 .

관련 정보