내 목표는 다음 규칙에 따라 파일의 모든 단어/문자열/문자를 새 단어/문자열로 바꾸는 것입니다.
- 숫자 문자가 단어/문자열 왼쪽에 있으면 해당 단어를 바꾸지 않습니다.
- 숫자 문자가 단어/문자열의 오른쪽에 있으면 해당 단어를 바꾸지 않습니다.
비고 - 숫자는 임의의 숫자 또는 [az] 또는 [AZ]를 의미합니다.
다음 예에서는 이전 파일과 이후 파일을 설명합니다.
"$$OLD_WORD$$"라는 단어를 "&&NEW_WORD&&"로 바꾸고 싶습니다.
예시 1 - 교체 전 파일
more file
ABC$$OLD_WORD$$ABC
$$OLD_WORD$$GG
$$OLD_WORD$$
1$$OLD_WORD$$
예시 2 - 대체된 파일
more file
ABC$$OLD_WORD$$ABC
$$OLD_WORD$$
&&NEW_WORD&&
1$$OLD_WORD$$
따라서 규칙 (1,2)에 대해 언급한 단어를 대체하기 위해 다음 구문을 작성했습니다(이 Perl 명령은 내 ksh 스크립트에 존재합니다).
perl -pe 'next if /^#/; s/(\Q|[[:^alnum:]])$ENV{OLD_TEXT}(\E|[[:^alnum:]])/$1$ENV{NEW_TEXT}$2/g' file
그러나 이 perl 명령은 예제 2처럼 대체되지 않습니다!
다음 예에서는 Solaris/Linux 시스템에서 얻은 결과를 설명합니다.
export OLD_TEXT='$$OLD_WORD$$'
export NEW_TEXT='&&NEW_WORD&&'
perl -pe 'next if /^#/; s/(\Q|[[:^alnum:]])$ENV{OLD_TEXT}(\E|[[:^alnum:]])/$1$ENV{NEW_TEXT}$2/g' file
&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&& &&NEW_WORD&&ABC$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&&WORD$&&NC
&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&& &&NEW_WORD&&$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&&
&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&&&&NEW_WORD&& &&NEW_WORD&&1$&&NEW_WORD&&$&&NEW_WORD&&OLD_&&NEW_WORD&
예제 2에 표시된 결과를 얻으려면 Perl 구문에서 수정해야 할 사항을 알려주십시오.
.
답변1
부정적인 Lookbehind/lookforward를 사용해야 합니다.
export OLD_TEXT='$$OLD_WORD$$'
export NEW_TEXT='&&NEW_WORD&&'
perl -pe 's/(?<![[:alnum:]])\Q$ENV{OLD_TEXT}\E(?![[:alnum:]])/$ENV{NEW_TEXT}/g' file
주어진
ABC$$OLD_WORD$$ABC
&&NEW_WORD&&
&&NEW_WORD&&
1$$OLD_WORD$$