sed - 인쇄 및 분기

sed - 인쇄 및 분기

파일 형식을 나타내는 문자열이 포함된 입력 스트림이 있습니다. 텍스트가 아닌 모든 파일 형식을 인쇄하고 싶습니다.또는PostScript입니다(PostScript는 텍스트 파일 형식입니다). 다음 sed 표현식을 시도했습니다.

sed -n '/PostScript/pb; /text/!p'

그러나 이는 오류를 반환합니다.

sed: -e expression #1, char 14: extra characters after command

bp패턴 뒤에 여러 명령(예를 들어)을 지정하는 것이 허용된다고 생각했기 때문에 이것이 나를 혼란스럽게 합니다.

다음 표현식을 사용하여 원하는 동작을 얻을 수 있습니다.

sed -n '/PostScript/p; /PostScript/b; /text/!p'

/PostScript/표현식의 패턴을 반복하지 않고 원하는 동작을 얻으려면 어떻게 해야 합니까 ?

답변1

명령 그룹을 함께 실행하는 일반적인 방법(예: 패턴 일치와 같은 조건 적용)은 명령을 중괄호로 그룹화하는 것입니다.
GNU 사용 sed:

sed -n '/PostScript/{p; b}; /text/!p'

sed두 경우 모두 그룹화 및 스크립트 끝으로의 분기가 없으며 다른 줄이 제거됩니다.

sed -e '/PostScript/b' -e '/text/!b' -e 'd'

또한 기록을 위해:

bp패턴 뒤에 여러 명령(예를 들어)을 지정하는 것이 허용된다고 생각합니다.

주소에 대한 편집 명령(말하는 모드는 컨텍스트 주소임)과 s대체 플래그 g, p및 다른 것 w입니다 no..

후자의 구문은 다음과 같습니다.

s/pattern/replacement/[flags]

즉, 플래그를 결합할 수 있으며(예: gp또는 7w outfile) 전자의 구문은 다음과 같습니다.

[2addr] {editing command
editing command
...
}

즉, 명령은 줄 바꿈으로 구분해야 합니다(경우에 따라 세미콜론으로 구분할 수 있음).

답변2

POSIX적으로:

$ sed -n '/PostScript/p; //b
/text/!p'

POSIX 정의정규식이 비어 있으면 sed마지막 명령에 사용된 마지막 RE가 적용된 것처럼 동작해야 합니다.


귀하의 명령을 사용하려면 ;Between pbGNU sed와 작동하게 하려면 다음이 필요합니다.

$ sed -n '/PostScript/p; //b; /text/!p'

POSIX sed의 경우 유효한 분기 이름을 //b;사용할 수 없습니다 . ;명령 사이의 종결자로 개행 문자를 사용해야 합니다.

관련 정보