이전에 인스턴스가 없는 경우 abc
의 모든 인스턴스를 교체 하고 싶습니다 .123
https://
암호:
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
당신이 찾고있는 것은부정적으로 뒤를 돌아보며, 지원되지 sed
도 awk
지원되지도 않습니다. 예를 들어 다음을 사용하는 것이 좋습니다 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
또는Initial
Final
- 이전과 마찬가지로
sed
표현식을 깨뜨리는 문자가 포함되어 있지 않습니다.