입력은 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
명령이 원하는 출력을 제공합니다.