나는 다음과 같은 일을하려고합니다 :
sed -i.bak '/^startswith/ s/$/endswith/' /path/to/file
하지만오직다음을 수행하는 라인의 경우아니요이미 "endswith"라는 문자열로 끝났습니다.
즉, 일부 텍스트로 시작하고 다음을 수행하는 줄을 찾고 싶습니다.아니요다른 텍스트로 끝나고 줄 끝에 원하는 텍스트를 추가하세요.
제가 현재 언급하고 있는다른 하위 문자열이 존재하지 않는 경우에만 하위 문자열을 검색하고 바꿉니다.매뉴얼 페이지 도 sed
있지만 내가 올바른 길을 가고 있는지 확신할 수 없습니다.
답변1
다음 방법이 유효합니다.
sed -i.bak '/endswith/b; /^startswith/ s/$/endswith/' /path/to/file
그러나 이것이 가장 효율적인 솔루션인지는 확실하지 않습니다.
답변2
내가 올바르게 이해했다면:
sed '/^startswith/s/endswith$//; /^startswith/s/$/endswith/' /path/to/file
왼쪽에서 오른쪽으로:
/^startswith
- 다음으로 시작하는 모든 줄을 찾습니다.'에 의해. . 시작',
s/endswith$//
- 기본적으로 후행/접미사를 제거합니다.'에 의해. . 마치다',
/^startswith
- 다시 다음으로 시작하는 모든 줄을 찾습니다.'에 의해. . 시작',
s/$/endswith/
- 지금은 모두'^시작'줄 끝에 "endswith"가 없으므로 그냥 추가하세요.
답변3
그냥 awk를 사용하세요:
awk '/^startswith/{ sub(/(endswith)?$/,"endswith") } 1' /path/to/file
답변4
Raku(이전 Perl_6) 사용
raku -pe 's/ (^^ header \s .* $$) /$0 trailer/ unless /trailer $$/;'
입력 예:
header 0123456789
header 0123456789 trailer
none 0123456789 trailer
none 0123456789
예제 출력:
header 0123456789 trailer
header 0123456789 trailer
none 0123456789 trailer
none 0123456789
https://docs.raku.org/syntax/s$SOLIDUS$SOLIDUS$SOLIDUS
https://raku.org