이 간단한 코드가 있습니다
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로 구현했습니다! 아주 좋아!