쉘은 마지막 일치 후에 문자열을 추가합니다.

쉘은 마지막 일치 후에 문자열을 추가합니다.

마지막 일치 항목 뒤에 문자열을 삽입하고 싶습니다. 예를 들면 다음과 같습니다.

바나나의 마지막 인스턴스 뒤에 삽입할 문자열: 주황색

입력하다

Apple
Banana
Apple
Banana

산출

Apple
Banana
Apple
Banana
Orange

XML 태그를 사용하여 이 작업을 수행하려고 합니다. 여는 태그를 추가하는 방법을 알아냈습니다.

답변1

짧고 간단하게 할 일정확히질문받은 내용:

printf '%s\n' '0?Banana?a' Orange . x | ex file.txt

변경 사항을 즉시 저장하는 대신 파일에 무엇이 저장되는지 확인하려면 다음을 사용하세요.

printf '%s\n' '0?Banana?a' Orange . %p | ex file.txt

이것이 하는 일:

파일의 처음부터 0검색 ( )뒤로( ?regex?)는 "Banana"의 다음 인스턴스(둘러싸기)를 나타내고 a"Orange" 줄을 추가합니다( ). 기간이 끝나면 추가, 저장 x및 종료하십시오.

답변2

tac a | sed '0,/Banana/{s/Banana/Orange\nBanana/}' | tac

할 것이다!

편집: 이 질문에 대한 답변 수정 -https://stackoverflow.com/questions/18291341/sed-only-the-last-match-pattern

답변3

sed -e:n -e'/\n.*Banana/!{$!{N' \
         -e'/Banana/bn' -eb -e\}\
         -e's/\n/&Orange&/;t'   \
         -e'/Banana/a\' -eOrange\
    -e\} -e'P;D' <<\IN
Apple
Banana
Apple
Banana
IN

Apple
Banana
Apple
Banana
Orange

이는 상당히 안정적으로 작동합니다. 패턴 공간에 버퍼링됩니다.~ 사이발생 횟수Banana입력 시 - 새 버퍼 그룹이 일치하면 마지막 버퍼 그룹의 전체 내용을 stdout으로 인쇄합니다. 그리고 마지막으로 등장한Banana어떤 상황이든 올바르게 처리해야 합니다.어디입력 시 발생합니다. 또한 출력을 쓰기 전에 전체 입력 파일을 읽을 필요가 없습니다.

관련 정보