'#\s' 없이 시작하는 '무언가'에 대한 Perl 여러 줄 일치

'#\s' 없이 시작하는 '무언가'에 대한 Perl 여러 줄 일치

업데이트:

  1. 이 MULTILINE 질문에 대한 실제 답변은 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을 사용하십시오.

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

부정적인 Lookbehind라고 함 http://www.blackwasp.co.uk/RegexLookahead.aspx

아이디어를 제공한 Kusalananda에게 감사드립니다.

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

답변3

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

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

산출:

   parameter=replaced
# parameter=10
parameter=replaced

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

관련 정보