Bash에서 줄 바꾸기 및 추가

Bash에서 줄 바꾸기 및 추가

파일의 값을 읽고 추가하고 바꾸는 방법은 무엇입니까?

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.10000if $verwas 생성됩니다 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-- 다음 인수를 실행할 코드로 사용

이 코드는 입력의 모든 줄에서 검색 및 바꾸기를 수행하도록 지시합니다. "검색" 부분은 다음 줄과만 일치합니다.

  1. 첫 번째ver="
  2. 그 뒤에 하나 이상의 숫자가 옵니다( \d+"한 번 이상 숫자와 일치"를 의미).
  3. .그 뒤에는 정규식 규칙에 따라 이스케이프해야 하는 마침표가 옵니다.
  4. 그 뒤에 하나 이상의 마침표가 아닌 문자가 옵니다.
  5. 마침표가 뒤따른다.
  6. 그 뒤에 하나 이상의 마침표가 아닌 문자가 옵니다.
  7. 그 뒤에 큰따옴표가 옵니다.

항목 #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.

관련 정보