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 및 그렇지 않더라도 내부적으로 일치하는 것을 방해하지 않습니다.K
b
0:0
10:02
1:0:0.3
:
.
단어 문자그래서 거기에단어 경계사이 :
및 0
사이 0
및 .
.