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