![sed에 중괄호가 필요한 이유는 무엇입니까?](https://linux55.com/image/66065/sed%EC%97%90%20%EC%A4%91%EA%B4%84%ED%98%B8%EA%B0%80%20%ED%95%84%EC%9A%94%ED%95%9C%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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
스크립트에는 다음 형식의 편집 명령이 포함되어야 합니다.
[주소[,주소]]기능어디
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"를 일치시킨 다음 인쇄합니다. 따라서 이 추가 명령을 그룹화하려면 중괄호를 사용해야 합니다.