vim 일반 모드의 "%s"와 일반 GNU sed의 차이점은 무엇입니까

vim 일반 모드의 "%s"와 일반 GNU sed의 차이점은 무엇입니까

저는 정규식을 처음 접했고 정규식을 사용하여 markdown(maardown의 사용자 정의/제작 형식)을 html로 변환하는 것이 시작하는 좋은 방법이라고 생각했습니다. Vim(8.1)에서는 다음 줄을 변환하라는 메시지가 표시됩니다.

+style
#include <style.css>
-style

도착하다;

<link rel="stylesheet" type="text/css" href="style.css">

저는 Vim에서 이 명령을 사용했습니다.

:%s/^+style$\n\(.*\)$\n^-style/<link rel="stylesheet" type="text\/css" href="\1">/g

나는 내가 원하는 것을 얻었습니다. 그러나 GNU sed를 사용하여 터미널에서 동일한 명령을 실행하면 출력에 변화가 없습니다.

sed 's/^+style$\n\(.*\)$\n^-style/<link rel="stylesheet" type="text\/css" href="\1">/g'

또한 -z플래그를 포함하는 것은 별로 도움이 되지 않는 것 같습니다. 출력은 입력과 동일하게 유지됩니다.

이유를 모르겠습니다.

답변1

질문에 표시된 대로 명령은 줄 중심 편집기이므로 sed입력에서 개행을 전혀 볼 수 없습니다 . 데이터는 실제 개행 문자가 제거된 상태로 한 번에 한 줄씩 sed표시됩니다 .sed

-zGNU를 사용하여 추가하면 sed유틸리티에서 \0구분 기호로 nul( )을 사용하게 됩니다. 이것은 당신이 이제 얻을 것을 의미합니다모두문서를 즉시 sed편집 버퍼에 넣고 사용할 수 있습니다 \n. 그러나 이는 시작과 끝도 일치하지 않음을 ^의미 합니다.$철사더이상.

개인적으로 나는 표준 sed명령을 사용합니다

sed '/^+style$/,/^-style$/ s|^#include.*|<link rel="stylesheet" type="text/css" href="style.css">|' file

이는 수행하려는 작업과 다른 세 가지 작업을 수행합니다.

  1. /^+style$/,/^-style$/이는 명령이 영향을 미치는 행을 지정하기 위해 주소 범위를 사용합니다 s///.

  2. 이 범위 내에서 대체 명령은 #include줄의 시작 부분에서 일치합니다.

  3. 바꾸기 명령은 패턴 및/또는 대체 텍스트가 이스케이프 없이 포함될 수 있도록 |일반적인 구분 기호 대신 구분 기호를 사용하여 작성 됩니다. 이는 가독성에 도움이 됩니다.//

(또한 그렇지 않습니다.필요하다그누 sed. )

/수정된 명령은 Vim에서도 사용할 수 있지만 Vim에서 명령을 구분하는 용도 로 사용해야 합니다 s///. 편집자는 ed동일한 명령을 사용할 수 있습니다 sed.

관련 정보