고쳐 쓰다:
- Stephane은 여기에서 이 여러 줄 질문에 대한 실제 답변을 제공합니다.https://unix.stackexchange.com/a/521560/354415
- 또는 Terdon의 Perl을 사용하여 다음 줄을 한 줄씩 확인하세요.https://unix.stackexchange.com/a/521512/354415
- 또는 여기에서 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
코드는 단순히 문자로 시작하지 않는 모든 줄에 대체를 적용합니다 #
.