고정된 행 순서와 그 이후의 모든 항목 삭제

고정된 행 순서와 그 이후의 모든 항목 삭제

입력은 input.txt다음 줄을 포함하는 파일 입니다.

5
ccc
36
52
1
2
3
78
69
aaa
bb

고정 행 순서는 다음과 같습니다.

1
2
3

이 시퀀스와 그 이후의 모든 항목을 제거하고 이것만 얻고 싶습니다.

5
ccc
36
52

이 출력을 에 삽입해야 합니다 output.txt. sed와 grep을 동시에 사용할 수 있다고 생각했는데 사용할 수 없습니다.

답변1

를 사용하는 한 가지 방법 sed은 3줄 "슬라이딩 창"을 사용하는 것입니다.
한 번에 한 줄씩 인쇄하고 특정 3줄 시퀀스가 ​​패턴 공간에 있을 때 종료합니다.

sed -n '1N;$!N;/1\n2\n3/q;P;D' input > output

답변2

사용 pcregrep:

$ pcregrep -v -M "^1$\n^2$\n^3$\n(.*\n)*" file

-v, --역방향 매칭

일치하지 않는 행을 선택하려면 일치의 의미를 반대로 합니다. (-v는 POSIX에 의해 지정됩니다.)

-M, --여러 줄

여러 줄에서 패턴 일치를 허용합니다. 이 옵션을 지정하면 패턴에 리터럴 개행 문자와 ^ 및 $ 문자의 내부 발생이 효과적으로 포함될 수 있습니다.

$ pcregrep  -M "^1$\n^2$\n^3$\n(.*\n)*" file
1
2
3
78
69
aaa
bb

위 명령은 여러 줄 패턴과 그 이후의 각 레코드를 가져옵니다. 옵션을 사용하면 -v명령이 원하는 출력을 제공합니다.

관련 정보