Perl 여러 줄 일치 '#\s'로 시작하는 '무언가'

Perl 여러 줄 일치 '#\s'로 시작하는 '무언가'

고쳐 쓰다:

  1. Stephane은 여기에서 이 여러 줄 질문에 대한 실제 답변을 제공합니다.https://unix.stackexchange.com/a/521560/354415
  2. 또는 Terdon의 Perl을 사용하여 다음 줄을 한 줄씩 확인하세요.https://unix.stackexchange.com/a/521512/354415
  3. 또는 여기에서 IFS를 한 줄씩 사용합니다.https://unix.stackexchange.com/a/521550/354415

이것은 내 새 장난감입니다.

문제는 매개변수 앞에 #\s*가 없는 행만 일치시키길 원한다는 것입니다.

sed 등과 같은 대체 코드를 제공하지 마십시오. 펄을 사용하여

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

예상 출력

parameter=replaced
# parameter=10
parameter=replaced

추신: 내 진행 상황을 확인하고 싶다면 여기를 살펴보세요.가변 길이 우회로 Perl Negative Lookbehind가 가능합니까?

답변1

여러 줄 문자열을 단일 변수로 전달하도록 선택했기 때문에 이는 복잡합니다. 배열로 변환하는 것이 훨씬 쉽기 때문에 s///가장 간단한 형태로 연산자를 사용할 수 있습니다. 이것을 시도해 보세요: 코드 개선에 관심이 없다고 하셨지만 미래의 사용자를 돕기 위해 여기에 작성한 내용의 단순화된 버전이 있습니다. 이는 또한 비환경 변수에 ALLCAPS를 사용하는 나쁜 습관을 방지합니다.

newparameter='parameter=replaced'
filesection='
   parameter=9
# parameter=10
parameter=10
'

matchparamperl='^([^#]*)parameter\s*=.*'

sectionfixed=$( perl -le '
                         @lines=split(/\n/,$ARGV[0]);
                         s/$ARGV[1]/$1$ARGV[2]/g for @lines; 
                         print join "\n", @lines
                         ' "$filesection" "$matchparamperl" "$newparameter") 
echo "$sectionfixed"

그러면 다음이 반환됩니다.

$ echo "$sectionfixed"

   parameter=replaced
# parameter=10
parameter=replaced

또는 더 짧게:

sectionfixed=$( perl -le '
                         do{
                            s/$ARGV[1]/$1$ARGV[2]/g; print
                         } for split(/\n/,$ARGV[0])
                         ' "$filesection" "$matchparamperl" "$newparameter")

답변2

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

이렇게 되어있습니다)))

산출:

parameter=replaced
# parameter=10
parameter=replaced

부정적인 리뷰 http://www.blackwasp.co.uk/RegexLookahead.aspx

이 아이디어를 주신 Kusarananda에게 감사드립니다.

나는 결코 그것을 생각하지 않았을 것입니다.

답변3

contents='
   parameter=9
# parameter=10
parameter=10
'

sed '/^#/!s/parameter[[:blank:]]*=.*/parameter=replaced/' <<<"$contents"

산출:

   parameter=replaced
# parameter=10
parameter=replaced

sed코드는 단순히 문자로 시작하지 않는 모든 줄에 대체를 적용합니다 #.

관련 정보