패턴 공간에서 첫 번째 라인 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
합니다 . 그럴 필요는 없습니다 . 단지 루프를 더 잘 보여주기 위한 것입니다.t
b
s
{}
답변3
어리석지만 작동 중:
sed 'h;G;s/\n/&&/;s/^\(.*\)\n\(.*\)\n\1\2$/\2/'
저게 뭐에요? 전체 내용을 두 배로 늘리고 첫 번째 개행 문자를 두 개의 개행 문자로 바꿉니다. 따라서 첫 번째 줄 뒤에 추가 줄바꿈을 사용하여 동일한 내용을 두 번 갖게 됩니다. 역참조를 사용하면 이제 다양한 부품을 식별할 수 있습니다.
보유 버퍼를 사용하지 않으려는 경우:
sed 's/.*/&&/;s/\n/&&/;s/^\(.*\)\n\(.*\)\1\2$/\2/'
아니요, 그건 싫습니다. 피할 수 있는 방법이 있으면 피하세요.