파일의 값을 읽고 추가하고 바꾸는 방법은 무엇입니까?
foo="val"
ver="1.2.0001"
...
이제 "0001"을 "0002"로 늘리고 싶습니다.
답변1
패치 수준은 항상 4자리 문자열이라고 가정합니다.
$ ver=1.2.0001
$ printf '%s\n' "$ver" | awk -F '.' '{ printf("%s.%s.%04d\n", $1, $2, $3 + 1) }'
1.2.0002
awk
버전을 가져와서 점으로 구분된 세 개의 필드로 처리합니다. 처음 두 필드를 있는 그대로 인쇄하지만 세 번째 필드에 1을 추가하고 %04d
결과를 (0으로 채워진 4자리 10진수) 형식으로 지정합니다.
1.2.10000
if $ver
was 생성됩니다 1.2.9999
.
값을 다시 저장하려면 ver
를 사용하십시오 ver=$( printf ... | awk ... )
.
답변2
perl
매우 강력한 텍스트 조작기인 를 사용할 수 있습니다 .
perl -pi -e 's/(^ver="\d+)\.(\d+)\.(\d+)"/"$1.$2." . sprintf("%04d", $3+1) . "\""/e' input
그러면 세 가지 옵션으로 Perl이 호출됩니다.
-p
-- 입력의 각 줄을 자동으로 인쇄합니다.-i
-- 파일을 제자리에서 편집-e
-- 다음 인수를 실행할 코드로 사용
이 코드는 입력의 모든 줄에서 검색 및 바꾸기를 수행하도록 지시합니다. "검색" 부분은 다음 줄과만 일치합니다.
- 첫 번째
ver="
- 그 뒤에 하나 이상의 숫자가 옵니다(
\d+
"한 번 이상 숫자와 일치"를 의미). .
그 뒤에는 정규식 규칙에 따라 이스케이프해야 하는 마침표가 옵니다.- 그 뒤에 하나 이상의 마침표가 아닌 문자가 옵니다.
- 마침표가 뒤따른다
.
- 그 뒤에 하나 이상의 마침표가 아닌 문자가 옵니다.
- 그 뒤에 큰따옴표가 옵니다.
항목 #1과 #2는 대체 텍스트로 괄호 안에 함께 그룹화됩니다 $1
. 항목 #4는 대체 텍스트 $2
이고 항목 #6은 대체 텍스트 $3이 됩니다. 하지만 다시 제자리에 놓기 전에 $3
값을 1씩 증가시키는 형식화된 인쇄 문을 통해 보냅니다.
교체 시 Perl 코드를 실행해야 하기 때문에 항목 7에 필요한 후행 큰따옴표도 다시 추가 e
해야 합니다 .s///
여러 가지 방법으로 이 정규식을 강화하거나 느슨하게 할 수 있습니다. 아마도 일치하는 "ver" 문자열이 줄에 있는 유일한 문자열이어야 할 수도 있습니다. 이 경우 $
항목 #7에서 double을 사용할 수 있습니다. 따옴표 뒤에 라인 앵커가 있습니다.
답변3
그리고 bash
:
$ ver="1.2.0001"
$ printf -v ver '%s.%04d' "${ver%.*}" "$((${ver##*.} + 1))"
$ echo "$ver"
1.2.0002
${ver%.*}
1.2
접두사 제거 접미사 패턴을 얻는 데 사용됩니다..*
${ver##*.}
0001
가장 긴 접두사 패턴의 숫자 부분을 제거하는 데 사용됩니다 .*.
printf -v ver ...
bash 연산을 사용하여 접두사 더하기 기호.
와 증가하는 숫자를 인쇄$((... + 1))
하고 출력을 다시 변수에 저장합니다ver
.