연속된 줄에서 일치하는 텍스트를 찾고 다음 줄의 값을 늘립니다.

연속된 줄에서 일치하는 텍스트를 찾고 다음 줄의 값을 늘립니다.

파일에서 문자열(Name2)을 찾고 다음 줄에서 버전(*abc-xyz-0-197)을 일치시키고 증가된 값으로 ID 줄을 업데이트하려고 합니다.

이것이 어떻게 달성될 수 있습니까?

파일은 다음과 같습니다.

  Name1:
    version: *abc-xyz-0-197
    ID: 1
    primary_data: 
    somedata:
      

  Name2:
    version: *abc-xyz-0-196
    ID: 3
    primary_data: 
    somedata:

  Name3:
    version: *abc-xyz-0-192
    ID: 6
    primary_data: 
    somedata:

출력은 다음과 같아야 합니다. (이름 2 및 버전: *abc-xyz-0-196)

  Name1:
    version: *abc-xyz-0-197
    ID: 1
    primary_data: 
    somedata:
      

  Name2:
    version: *abc-xyz-0-196
    ID: **4**
    primary_data: 
    somedata:

  Name3:
    version: *abc-xyz-0-192
    ID: 6
    primary_data: 
    somedata:

답변1

입력 파일의 단락 모드 처리를 활성화하려면 빈 문자열을 사용 awk하고 설정합니다 .RS=

awk -v RS= -F'\n' '$1 ~ /^ *Name2:$/ && $2 ~ /^ *version: \*abc-xyz-0-196$/ {
    bakline=$0; sub(/.*ID:/,""); newId=$0+1; 
    $0=bakline"\n"; sub(/ID: [0-9]+/,"ID: " newId);
}1' infile

첫 번째와 두 번째 줄이 요구 사항과 일치하는지 확인하고 일치하는 청크에서 백업하고 모든 것을 제거 ID:하고 나머지 유효한 문자열을 증가시킨 다음 백업 변수에서 청크를 반환하고 ID를 newId 값으로 바꿉니다.

답변2

여기에서 범위 연산자를 사용하여 ,원하는 데이터 포인트를 선택한 다음 변경할 수 있습니다.

awk '$1=="Name2:",(!NF) {
  if ($2=="*abc-xyz-0-196") f++
  if ($1 == "ID:" && f) sub(/[0-9]+/, $2+1)
  if (!NF) f=0
}1' file

답변3

perl -00pe 's/Name2:\s*version: \*abc-xyz-0-196\s*ID: \K(\d+)/$1+1/e' ex

어디:

  • perl -00pe ...-->각 입력 단락마다 실행 ...및 인쇄
  • s/.../exp/e--> ...결과로 교체eval exp
  • /...1\K...2/--> ...1왼쪽 컨텍스트를 가져와서 버스로 바꿉니다....2

관련 정보