가변 길이 우회로 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 Oneliner로 구현했습니다! 아주 좋아!

관련 정보