콘텐츠 검색 및 바꾸기

콘텐츠 검색 및 바꾸기
PIN A
1 1:3 0:8
0 0:0

PIN B
1 1:0
0 0:0
Z Z:0

PIN C
1 1:3 0:8
0 0:0
Z Z:0

PIN B에는 영향을 주지 않고 PIN A와 PIN C의 내용만 변경하고 싶습니다.

0 0:3
Z 0:3

일반 검색 및 바꾸기 방법을 사용하여 PIN B의 내용에 영향을 주지 않고 바꾸는 방법을 찾을 수 없는 것 같습니다.

perl -i -pe 's/0:0/0:3/g;' text
perl -i -pe 's/Z:0/Z:3/g;' text

원하는 출력:

PIN A
1 1:3 0:8
0 0:3

PIN B
1 1:0
0 0:0
Z Z:0

PIN C
1 1:3 0:8
0 0:3
Z Z:3

답변1

-00레코드가 빈 줄로 구분되는 단락 모드를 사용하고 다음을 수행할 수 있습니다.

perl -00 -i -pe 's/\b[0Z]:\K0\b/3/g if /^PIN (A|C)\b/' text

(또는 if /^PIN [AC]\b/단일 문자 PIN에만 해당)

또는:

perl -00 -i -pe 's/\b[0Z]:\K0\b/3/g unless /^PIN B\b/' text

보다 일반적인 접근 방식은 기록하는 것입니다.현재 비밀번호변수를 선택하고 해당 변수에 원하는 값이 있으면 바꿉니다.

perl -i -pe '
  if (/^PIN (.*)/) {
    $pin = $1;
  } else {
    s/\b[0Z]:\K0\b/3/g unless $pin eq "B";
  }' text

이는 내부적으로 일치를 피하기 위해 앞뒤에 단어 경계가 있는 경우 s/\b[0Z]:\K0\b/3/g후행 0 [0Z]:0( 일치에서 대체될 항목의 시작을 \K표시하는 데 사용됨 )을 3으로 대체합니다. 이는 as 및 그렇지 않더라도 내부적으로 일치하는 것을 방해하지 않습니다.Kb0:010:021:0:0.3:.단어 문자그래서 거기에단어 경계사이 :0사이 0..

관련 정보