sed에 중괄호가 필요한 이유는 무엇입니까?

sed에 중괄호가 필요한 이유는 무엇입니까?

sed에서 제한된 범위의 검색을 하고 싶어서 시도해 보았습니다.

sed -n '195,210 /add/ p' <file>

이것은

sed: -e 표현식 #1, 문자 9: 알 수 없는 명령: `/'

순전히 추측으로 중괄호를 추가해 보았습니다.

sed -n '195,210{/add/p}' <file>

성공했지만 이해하려고 노력 중이에요추가된 교정기와 함께 작동합니다.
나는 bash에서 중괄호가 표현식을 구분할 수 있고 실행 순서를 늘릴 수 있다는 것을 이해합니다. 하지만 sed의 경우 이 중괄호는 무엇을 하고 있나요?

관련 정보

$ sed --version
sed (GNU sed) 4.2.2

$ bash --version
GNU bash, version 4.3.11

답변1

~에 따르면POSIX기준페이지에서sed:

스크립트에는 다음 형식의 편집 명령이 포함되어야 합니다.

[주소[,주소]]기능

어디function목록의 한 문자 명령 동사를 나타냅니다.sed에서 명령 편집, 그 뒤에 적용 가능한 매개변수가 옵니다.

따라서 주소 뒤의 공백이 아닌 첫 번째 문자는 명령 동사로 간주됩니다. 특정 경우에는 이므로 /오류가 발생 합니다 char 9: unknown command: '/'.
중괄호는 아래에 추가로 인용되어 있습니다.

[2주소] {편집 명령
편집 명령
...
}
    실행 목록sed명령은 배열 공간을 선택한 경우에만 편집할 수 있습니다. …

  [2주소]는 허용되는 최대 주소 수가 2개임을 의미합니다.

위의 점을 명확히 하기 위해,주소부분sed(1)설명하다:

Sed명령은 주소 없이 주어질 수 있으며, 이 경우 명령은 주소가 있는 모든 입력 라인에서 실행됩니다. 이 경우 명령은 해당 주소와 일치하는 입력 라인에서만 실행됩니다. 명령은 첫 번째 주소에서 시작하여 두 번째 주소까지 이어지는 라인의 포함 범위와 일치하는 모든 입력 라인에 대해 실행됩니다. 주소 범위에 관해 주의할 세 가지 사항: 구문은 다음과 같습니다(즉, 주소는 쉼표로 구분됩니다).addr1,addr2

이것GNU 정보 페이지( info sed)"3.4 공통 명령"과 {유사한 설명이 있습니다 .}

{주문하다}
    명령 세트는 {}문자 사이에 포함될 수 있습니다. 이는 단일 주소(또는 주소 범위) 일치로 일련의 명령을 트리거하려는 경우 특히 유용합니다.

즉, 중괄호는 동일한 주소에 여러 명령이나 중첩된 주소를 적용하는 데 사용됩니다.
여기서는 표준이 명확하지 않지만 여는 중괄호는{ 실제로는다른 sed 명령 그룹을 시작하는 명령입니다(그룹은 닫는 중괄호로 끝납니다 }).

그리고 실제로 갈 위험을 무릅쓰고긴 이야기 짧게, 질문은 195, 210, 그리고 /add/둘 다 입니다주소. sed세 주소에서는 어떤 명령도 호출할 수 없습니다. 따라서 명령이 작동하도록 하는 방법은 {주소 범위에서 명령을 호출 195,210한 다음 (해당 범위 내에서) p주소에서 명령을 호출하는 것 입니다 /add/.

답변2

sed중괄호에 대한 문서 에 따르면 중괄호는 명령을 그룹화하는 데 사용됩니다. 그래서

sed -n '195,210{/add/p}' <file>

195,210블록 명령이 포함된 주소 범위가 먼저 고려됩니다. 블록 명령은 /add/주소 지정과 인쇄 명령으로 구성됩니다.p

답변3

sed 구문은 다음과 같습니다

주소/명령.

따라서 195,210이 일치하는 첫 번째 주소이지만 이 범위에서 새 명령을 실행하려고 합니다. 즉, "add"를 일치시킨 다음 인쇄합니다. 따라서 이 추가 명령을 그룹화하려면 중괄호를 사용해야 합니다.

관련 정보