"sed -e"에 전달된 이 스크립트의 기능은 무엇입니까?

"sed -e"에 전달된 이 스크립트의 기능은 무엇입니까?

TL;DR- 아래 패턴에는 많은 일이 일어나고 sed있으며 개별 부분을 전체 명령으로 결합하는 방법을 잘 모르겠습니다.


히트 버전:GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin21)

RBENV 코드 베이스 파일을 파일별로 읽어 쉘 스크립팅을 배우고 있는데 다음 rbenv-help과 같은 파일을 발견했습니다.이 함수 정의:

extract_initial_comment_block() {
  sed -ne "
    /^#/ !{
      q
    }

    s/^#$/# /

    /^# / {
      s/^# //
      p
    }
  "
}

이 함수가 어떻게 호출되는지 이해합니다.코드 아래이므로 첫 번째 인수가 파일 이름이라는 것을 알 수 있습니다.

extract_initial_comment_block < "$filename" | collect_documentation

여기에서 "$filename"으로 표시된 파일이 명령의 표준 입력으로 사용되는 것을 볼 수 있습니다 sed. 내 질문에 관한 한 체인 기능 "collect_documentation"은 관련이 없습니다.

나는 또한 함수의 이름을 통해 그 목적이 다음과 같은 파일을 얻는 것임을 알고 있습니다.이것, 요약 및 사용법 설명(링크된 파일의 2-14행)을 반환합니다. 그러나 나는 이 이론을 테스트하지 않았으므로 100% 정확하지 않을 수도 있습니다.

게다가 나도 알아이 StackExchange 답변에서이 플래그의 목적은 후속 문자열이 명령(또는 개행 문자로 구분된 명령 모음)으로 해석되도록 -e지시하는 것입니다 . sed따라서 본문에는 순서대로 해석하기 extract_initial_comment_block위한 3개의 별도 스크립트가 포함되어 있는 것처럼 보입니다. sed동일한 StackExchange 답변은 {...}명령을 함께 그룹화하는 것에 대해 설명하지만 이것이 이 정규식(이 정규식?)에서 무슨 일이 일어나고 있는지 확실하지 않습니다.

내가 아는 한 sed여기에는 3개의 스크립트가 있습니다.

    /^#/ !{
      q
    }
    s/^#$/# /
    /^# / {
      s/^# //
      p
    }

그러나 각 스크립트 내에서도 다음 ^#과 같은 것을 활용한 후에도 식별할 수 없는 일부 패턴(예: 및 )이 사용됩니다.!{ q }리눅스 데이터 프로젝트. 움직이는 부분이 많은 것 같고 각 스크립트가 어떻게 최종 제품에 결합되는지 잘 모르겠습니다.

나는 내 사고 과정을 가능한 한 명확하게 설명하려고 노력합니다. 지금까지 내 생각이 맞나요? 그렇지 않다면 내가 어디로 갔는가? 그렇다면 전달된 각 명령의 의미를 어떻게 추론합니까 sed?

답변1

/^#/ !{
      q
    }

슬래시 사이의 부분은 ^문자열의 시작 부분, #즉 문자 자체를 나타내는 정규 표현식입니다. 이 모드는 연관된 명령이 실행되는 행을 선택합니다. 후행은 !일치의 의미를 반전시키며 q종료하라는 명령입니다. 따라서 sed 프로그램이 한 줄을 보면 종료됩니다.아니요comment 태그로 시작하세요 #.

 s/^#$/# /

s/a/b/ 에스^줄의 시작, $끝, 줄 자체를 의미하는 a 대신 b를 사용하세요 #. 따라서 한 줄만 입력하면 +space #로 변경됩니다.#

/^# / {
  s/^# //
  p
}

#줄이 /^# /a 및 공백( )으로 시작하는 경우 #및 공백을 빈 공백( s/^# //)으로 바꾸고 해당 줄( p)을 인쇄합니다. 이전 교체가 유용한 곳입니다.

sed의 옵션 -n(명령 시작 부분) sed에게 알려주세요.아니요기본적으로 수행되는 것과 마찬가지로 스크립트를 실행한 후 해당 줄을 인쇄합니다.

스크립트는 #및로 시작하는 줄을 무시합니다.아니요그 뒤에는 공백이 있으며, 해당 공백으로 시작하는 hashbang 줄을 포함하면 #!스크립트가 어떤 인터프리터를 사용하는지 운영 체제에 알려줍니다. 의도한 것일 수도 있지만, 숨겨진 다른 대사가 있을 수도 있습니다.

예를 들어

#!/bin/sh
# some script
#
#this is ignored
# this prints

# this doesn't print any more
whatever

~이 되다

some script

this prints

관련 정보