sed를 사용하여 특정 단어 다음에 텍스트를 바꾸려면 어떻게해야합니까?


12

라는 파일이 .ignore있습니다. 를 교체해야합니다 projdir. 예를 들면 다음과 같습니다.

ignore \..*
ignore README
projdir Snake

Snake를 "PacMan"과 같은 것으로 바꿔야합니다. 맨 페이지를 읽었지만 어떻게해야할지 모르겠습니다.

답변:


18

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

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

^그리고 $패턴이 전체 라인을 일치하므로, / 행 끝 마커를 시작하고있다; .*무엇이든 일치합니다. 는 -i이야기 sed에 직접 변경 사항을 작성하는 .ignore단지를 출력하는 대신,


에 대한 long 옵션을 사용하면 더 많은 자체 문서화 -i--in-place그 예입니다.
Elijah Lynn

5

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

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은 () 안에서 일치하는 것을 의미합니다. "뱀"이후의 모든 것은 그대로 유지됩니다.


1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir은 문자열 projdir로 시작하는 행을 찾는 것입니다. . * $는 같은 행에서 projdir 뒤의 문자열을 나타냅니다. 문자열 projdir PacMan은 교체 할 문자열입니다. g는 전역을위한 것입니다-projdir로 시작하는 모든 그러한 줄을 대체합니다. .ignore는 파일 이름입니다.


1
답을 넓히고 무엇이 무엇인지 명확히 할 수 있습니까?
Romeo Ninov

명령이나 코드의 작동 방식과 이유에 대한 설명이 포함 된 경우 답변이 훨씬 유용합니다.
Anthony Geoghegan

나는 이것이 편집 후에 더 유용하기를 바란다
Tinu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.