파일에서 동일한 패턴 사이의 줄을 추출하는 방법

파일에서 동일한 패턴 사이의 줄을 추출하는 방법

고유하지 않은 두 패턴 사이의 선을 추출하는 방법은 무엇입니까?

예:-

data of type samplex
name a
property b
data of type samplex
name c
property d
data of type samplex
name e
property f
data of type sampley
name g
property h

"sampex 유형의 데이터" 스키마를 검색하고 그 사이에 발생하는 모든 행을 가져오고 싶습니다.

First occurrence:- 
name a
property b

Second occurrence:-
name c
property d

Third occurrence:- 
name e
property f

첫 번째 발생만 얻고 두 모드가 다른 경우,

sed '/pattern1/,/pattern2/p;/pattern2/q' <file> will work. 

필요에 맞게 이 명령을 어떻게 조정할 수 있습니까?

답변1

sed 's:data of type samplex:\n:g' File_name -i

이 코드는 해당 문자열을 줄 바꿈으로 대체하므로 필요한 정보를 얻을 수 있습니다. -i원본 파일의 변경 사항만 저장하려면 이 옵션을 사용하세요 .

답변2

이것이 당신에게 효과가 있습니까?

grep "data of type samplex" -A 2 <file>

답변3

당신이 원하는 것에 대한 나의 잘못된 해석에 근거하여... 분명히 전체 문구보다 적게 일치할 수 있다면 그것을 줄일 수 있습니다.

sed -n '/data\ of\ type\ samplex/,/data\ of\ type\ sampley/{s/data\ of\ type\ sample[xy]//; p}' file

-n
[xy]조용히, 출력이 x 또는 y와 일치하기를 원할 때까지 아무것도 인쇄하지 말고,
s/data\ of\ type\ sample[xy]//일치하는 패턴을 제거하고, 빈 줄을 남겨두고
p그 이후의 모든 것을 인쇄하세요.

산출:

name a
property b

name c
property d

name e
property f

필요한 경우를 대비해 "N번째 발생:-" 증분을 추가하는 방법을 찾지 못했습니다.

답변4

가정:

  • 입력 파일에는 다음과 같은 data of type키워드 구분이 뒤따르는 다양한 섹션이 있습니다.samplexsampley
  • 추출 필요: 특정 섹션에 속하는 모든 텍스트

코너 케이스를 반영하기 위해 입력 파일이 약간 수정되었습니다.

$ cat ip.txt 
data of type samplex
name a
property b
data of type samplez
name 1
property 2
data of type samplex
name e
property f
data of type sampley
name g
property h
data of type samplex
name c
property d

아래 솔루션에서는 부분이 일치하면 으로 $match설정되고, 그렇지 않으면 동작이 입력됩니다. 그런 다음 다음 섹션이 시작될 때까지 입력 라인이 인쇄됩니다. 이렇게 하면 파일 끝에 있는 부분도 처리됩니다.10data of type

$ perl -ne 'if(/data of type /){$match=/samplex$/} elsif($match){print}' ip.txt
name a
property b
name e
property f
name c
property d

$ perl -ne 'if(/data of type /){$match=/samplez$/} elsif($match){print}' ip.txt
name 1
property 2

$ perl -ne 'if(/data of type /){$match=/sampley$/} elsif($match){print}' ip.txt
name g
property h

관련 정보