게으른 방법

게으른 방법

이전에 인스턴스가 없는 경우 abc의 모든 인스턴스를 교체 하고 싶습니다 .123https://

암호:

file=Data.txt
Initial="# Start";
orig="abc";
new="123"; 

Final="$" # Line Number
sed -r -e "/${Initial}/,${Final}s/${orig}/${new}/g" ${file} # Final doesn't accept $

데이터:

# Start

abc.md
https://abc.md
The path is https://abc.md for abc.md
The path for abc.md is https://abc.md 

예상 출력:

# Start

123.md
https://abc.md
The path is https://abc.md for 123.md
The path for 123.md is https://abc.md 

이 목표를 어떻게 달성할 수 있나요?


참고: 또한 둘 사이에 패턴이 있을 수 있음을 나타내기 위해 ${Initial}and 를 사용해야 합니다 .${Final}

이 답변이 사건에는 해당되지 않음The path is: https://abc.md abc.md

답변1

당신이 찾고있는 것은부정적으로 뒤를 돌아보며, 지원되지 sedawk지원되지도 않습니다. 예를 들어 다음을 사용하는 것이 좋습니다 perl.

file=Data.txt
export Initial="# Start"
export orig="abc"
export new="123"
export Final="5"

perl -pe '
 $flag=1 if /$ENV{Initial}/;
 s,(?<!https://)$ENV{orig},$ENV{new},g if $flag;
 $flag=0 if $. == $ENV{Final};
' $file

답변2

https://다른 것(포함하지 않음)으로 시작하는 모든 인스턴스를 일시적으로 변경 abc하고 완료되면 다시 변경할 수 있습니다.

게으른 방법

sed -e 's_https://abc_protected_g;/# Start/,$s_abc_123_g;s_protected_https://abc_'

입력에 나타나지 않을 것이라고 확신할 수 있는 임시 문자열에 대한 일부 값을 선택해야 합니다(그리고 sed쉘에서 방해하거나 인용하는 특수 문자를 포함하지 않습니다). 사용해봤지만 protected좀 더 독특한 것을 추천하고 싶습니다.

철저한 접근

임시 문자열이 입력에 나타나지 않을지 확실하지 않은 경우 더 길지만 안전한 대안은 다음을 사용하는 것입니다.문자열 바꾸기:

sed -e 's/X/Xv/g;s_https://abc_Xu_g;/^# Start/,$s/abc/123/g;s_Xu_https://abc_g;s/Xv/X/g'

이 두 임시 문자열에 대한 요구 사항은 다음과 같습니다.

  • 공통 접두사가 있습니다(내가 사용했지만 X더 길거나 읽기 쉬울 수 있음).
  • 다른 변수에는 나타나지 않습니다 orig: new또는InitialFinal
  • 이전과 마찬가지로 sed표현식을 깨뜨리는 문자가 포함되어 있지 않습니다.

관련 정보