가변 길이 바이패스를 사용하는 Perl Negative Lookbehind가 가능할까요?

가변 길이 바이패스를 사용하는 Perl Negative Lookbehind가 가능할까요?

이 간단한 코드가 있습니다

perl -we 'my $file= "
    #    parameter=10
#    parameter=10
# parameter=10
    parameter=10
parameter=10
"; $file=~ s/((?<!# ))\s*parameter\s*=.*/parameter=replaced/g; print(":$file:\n")'

그리고 나는 그것이 모든 매개 변수 = 10을 대체하기를 원하지만 해당 줄의 어느 곳에서든지 해시가 앞에 오는 경우에는 그렇지 않습니다. 예를 들어

        #    parameter=10
#    parameter=10
# parameter=10
        parameter=replaced
parameter=replaced

내가 제공하면 알아요

((?<!#\s*))

오류가 발생했습니다.

정규식에서는 가변 길이 뒤돌아보기가 구현되지 않았습니다.

그렇다면 다른 방법으로 작업을 수행할 수 있는 방법이 있습니까?

감사해요

답변1

다음과 같이 할 수 있습니다:

s/#.*|((?<!\S)parameter\h*=.*)/$1 ? "parameter=replaced" : $&/ge;

아이디어는 #.*(우리가 그 자체로 대체하는)이 모든 주석을 뭉개버릴 것이라는 것입니다. 그리고 교대의 두 번째 부분에서 우리는 남은 패턴(여기서는 parameter=...공백이 아닌 것이 앞에 오지 않는 한)을 찾습니다.

또 다른 접근 방식은 다음을 사용하는 것입니다.

s/^[^#\n]*\K(?!<\S)parameter\h*=.*/parameter=replaced/gm;

\K교체할 부품의 시작을 설정합니다. 플래그 는 제목 내부의 모든 줄 시작 부분에서 일치 m합니다 .^

행의 시작 부분에서만 찾을 수 있는 경우 parameter=(선택적 공백이 뒤따름) 다음과 같습니다.

s/^\h*\Kparameter\h*=.*/parameter=replaced/gm;

답변2

글쎄, 내가 생각해낼 수 있는 유일한 대안은 이것이다.

FILESECTION="\
        #    parameter=10
#    parameter=10
#  parameter=10
        parameter=10
parameter=10
"

newfile=''
while IFS= read -r line ; 
    do 

    SECTIONFIXED=$( perl -le '$file=$ARGV[0]; $file=~ s/^(?!#+$)(\s*)(parameter\s*=.*)/parameter=replaced/g; print("$file\n");' "${line}" ; ) 
    newfile=$( printf "${newfile}\n${SECTIONFIXED}\n" )  
done <<< "$FILESECTION"

echo "$newfile" 

산출:

        #    parameter=10
#    parameter=10
#  parameter=10
parameter=replaced
parameter=replaced

'^(?!#+$)(\s*)'우리는 한 줄씩 부정적인 예측을 사용해야 합니다 . 그리고 가변 길이를 허용합니다. (아마도 여러 줄 문자열이 아니기 때문일까요? 아직 모르겠습니다.)

이 아이디어를 접하게 됐어요https://www.regextester.com/95226그리고 마침내 일을 시작했습니다.

오늘 새로운 것을 배웠습니다. 이것이 도움이 되기를 바랍니다!

추신. 우리는 또한 ([^#]*)제안한 대로 간단한 것을 사용할 수도 있습니다.테르돈 https://unix.stackexchange.com/a/521512/354415기본적으로 여기와 동일한 개념을 제안했지만 Perl One 라이너로 구현한 사람입니다! 아주 좋아!

관련 정보