
업데이트:
- 이 MULTILINE 질문에 대한 실제 답변은 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을 사용하십시오.
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
는 단순히 문자로 시작하지 않는 모든 줄에 대체를 적용합니다 #
.