접미사가 존재하지 않는 경우에만 텍스트의 일부 줄에 접미사를 추가합니다.

접미사가 존재하지 않는 경우에만 텍스트의 일부 줄에 접미사를 추가합니다.

나는 다음과 같은 일을하려고합니다 :

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

관련 정보