![sed: 패턴을 일치시키고 이후에 나타나는 다른 패턴을 각각 교체합니다. [닫기]](https://linux55.com/image/166415/sed%3A%20%ED%8C%A8%ED%84%B4%EC%9D%84%20%EC%9D%BC%EC%B9%98%EC%8B%9C%ED%82%A4%EA%B3%A0%20%EC%9D%B4%ED%9B%84%EC%97%90%20%EB%82%98%ED%83%80%EB%82%98%EB%8A%94%20%EB%8B%A4%EB%A5%B8%20%ED%8C%A8%ED%84%B4%EC%9D%84%20%EA%B0%81%EA%B0%81%20%EA%B5%90%EC%B2%B4%ED%95%A9%EB%8B%88%EB%8B%A4.%20%5B%EB%8B%AB%EA%B8%B0%5D.png)
내가 가지고 있고 그것이 에 대해 동일한 패턴일 수 있다고 aaaaabaaaaa
가정합니다 .a
b
패턴 일치를 수행한 다음 aaaaaab
'이후'를 모두 '로 바꾸되 '이전'은 바꾸지 않는 방법은 무엇입니까?aaaaa
b
b
a
b
답변1
sed에서는 너무 복잡하지만 Perl에서는 훨씬 쉽습니다.
perl -pe '/b/g and substr($_, pos) =~ s/a/A/g'
첫 번째 일치 항목은 위치가 설정된 문자열의 /b/g
첫 번째 항목과 일치합니다 . 그런 다음 해당 위치에서 시작하는 하위 문자열이 대체됩니다.b
pos
답변2
sed를 사용하세요. 단, 데이터에 절대 포함되지 않는 문자 시퀀스를 선택해야 합니다.
( echo 'zzzaaaaadddd' ;
echo 'ssssaaaaajaaaaakaaaaa';
echo 'ssssaaaaaaaaaakaaaaa'; ) | \
sed '/aaaaa.*aaaaa/ { s/aaaaa/_=|=_/; s/aaaaa/GGGGG/g; s/_=|=_/aaaaa/ }'
zzzaaaaadddd
ssssaaaaajGGGGGkGGGGG
ssssaaaaaGGGGGkGGGGG
설명하다:
- 최소 2개의 aaaaa 라인이 영향을 받습니다.
- 바꾸다아아아아
_=|=_
당신은 결코 가질 수 없는 밧줄을 가지고 - 다른 사람을 대신하다아아아아너가 원하는 것을해라구구구구
_=|=_
다시 교체아아아아
답변3
또한 다음 재귀 sed
솔루션을 시도해 보세요.
sed ':L; s/\(a*\)b\(a*\)a/\1b\2b/; tL; ' file
모든 대상 이벤트가 완료될 때까지 각 대상 a
이벤트를 반복적으로 교체합니다.b