파일 형식을 나타내는 문자열이 포함된 입력 스트림이 있습니다. 텍스트가 아닌 모든 파일 형식을 인쇄하고 싶습니다.또는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 p
및 b
GNU sed와 작동하게 하려면 다음이 필요합니다.
$ sed -n '/PostScript/p; //b; /text/!p'
POSIX sed의 경우 유효한 분기 이름을 //b;
사용할 수 없습니다 . ;
명령 사이의 종결자로 개행 문자를 사용해야 합니다.