매일 추가해야 하는 구성 파일이 있습니다.
예를 들어
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
이 부분을 단순화할 수 있습니다 .