sed를 사용하여 특정 단어 뒤의 텍스트를 바꾸는 방법은 무엇입니까?

sed를 사용하여 특정 단어 뒤의 텍스트를 바꾸는 방법은 무엇입니까?

.ignore교체해야 하는 파일이 있습니다 projdir.

ignore \..*
ignore README
projdir Snake

Snake를 "PacMan" 등으로 교체해야 합니다. 매뉴얼 페이지를 읽었지만 무엇을 해야할지 모르겠습니다.

답변1

다음으로 시작하는 줄을 검색 projdir하고 전체 줄을 새 줄로 바꿉니다.

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^라인 시작/끝 마커 이므로 $패턴은 전체 라인과 일치합니다 .*. 변경사항을 출력하는 대신 직접 작성 -i하도록 지시합니다 .sed.ignore

답변2

한 가지 방법은 유지하려는 부분에 대한 역참조를 사용하여 전체 줄을 다시 작성하는 것입니다.

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

또 다른 접근 방식은 줄의 해당 부분을 다시 작성하는 것입니다. 하지만 다른 부분이 일치하는 경우에만 가능합니다.

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

두 예제 모두 첫 번째 단어가 인 줄에서 두 번째 공백으로 구분된 단어를 다시 씁니다 projdir.

답변3

이 게시물은 오래된 게시물이고 허용된 답변으로 문제를 해결한 것 같지만 실제 질문에 대한 답변은 아직 없습니다. 따라서 완전성과 다른 사람들을 돕기 위해:

여기의 대답은 실제로 "projdir"로 시작하는 줄이 아니라 "Snake"와 일치합니다...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

이렇게 하면 줄 시작 부분에서 시작하는 모든 항목("Snake" 포함)이 "Snake" + "PacMan" 이전의 모든 항목으로 대체됩니다. \1은 () 내에서 일치하는 내용을 나타냅니다. "Snake" 이후의 모든 것은 동일하게 유지됩니다.

답변4

"sed를 사용하여 특정 단어 뒤의 텍스트를 바꾸는 방법"이라는 제목의 질문에 대답하려면 다음을 수행하십시오.

sed -i '/projdir$/!{s/Snake/PacMan/}' .ignore

우리 모두는 Snake함께 작동할 것으로 예상되지 않기 때문에 놀라운 일을 합니다 !projdir

관련 정보