패턴 공간에서 첫 번째 줄을 제거하는 이식 가능한 방법(여러 줄이 있는 경우)

패턴 공간에서 첫 번째 줄을 제거하는 이식 가능한 방법(여러 줄이 있는 경우)

패턴 공간에서 첫 번째 라인 1을
제거하는 이식 가능한 방법은 무엇입니까 ? gnu sed내가 할 수 있는 일로

s/[^\n]*\n//

그러나 내가 아는 한, 이것은 ( \n대괄호 []표현식에 사용됨) 이식 가능하지 않습니다.


실제 예:여기서는 sed구분 기호를 포함하여 파일의 마지막 부분이 인쇄됩니다.이식 가능한 코드를 통해. 구분 기호를 제외하고 이식 가능한 방식으로 수행하기 위해 패턴 공간에서 첫 번째 줄을 제거하고 싶습니다. 매우 gnu sed간단합니다:

sed 'H;/===/h;$!d;//d;x;s/[^\n]*\n//' infile

1: 분명히 이 작업은 명령 주기를 다시 시작하지 않고 수행되어야 합니다...

답변1

이와 같은 작업을 이식 가능하게 수행하는 한 가지 방법은 다음과 같습니다.

sed -e '
   # ... assuming prev sed cmds made pattern space carry newline(s)
   y/\n_/_\n/     ;# exchange newlines with an underscore
   s/^[^_]*_//    ;# remove up till the first underscore, ummm newline
   y/\n_/_\n/     ;# revert the transformation
' 

답변2

시도해 볼 만한 적절한 sed가 없지만 언제든지 내부 루프를 수행하여 개행 문자에 도달할 때까지 문자를 테스트하고 제거할 수 있습니다.

sed 'H
/===/h
$!d
//d
x
{
   :rpt
   s/^\n//
   t done
   s/.//
   t rpt
}
:done
'

두 번째 테스트 분기는 마지막 읽기 이후에 성공했음을 나타내는 내부 플래그를 재설정하기 위해 a 대신 a여야 t rpt합니다 . 그럴 필요는 없습니다 . 단지 루프를 더 잘 보여주기 위한 것입니다.tbs{}

답변3

어리석지만 작동 중:

sed 'h;G;s/\n/&&/;s/^\(.*\)\n\(.*\)\n\1\2$/\2/'

저게 뭐에요? 전체 내용을 두 배로 늘리고 첫 번째 개행 문자를 두 개의 개행 문자로 바꿉니다. 따라서 첫 번째 줄 뒤에 추가 줄바꿈을 사용하여 동일한 내용을 두 번 갖게 됩니다. 역참조를 사용하면 이제 다양한 부품을 식별할 수 있습니다.

보유 버퍼를 사용하지 않으려는 경우:

sed 's/.*/&&/;s/\n/&&/;s/^\(.*\)\n\(.*\)\1\2$/\2/'

아니요, 그건 싫습니다. 피할 수 있는 방법이 있으면 피하세요.

관련 정보