고유하지 않은 두 패턴 사이의 선을 추출하는 방법은 무엇입니까?
예:-
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
키워드 구분이 뒤따르는 다양한 섹션이 있습니다.samplex
sampley
- 추출 필요: 특정 섹션에 속하는 모든 텍스트
코너 케이스를 반영하기 위해 입력 파일이 약간 수정되었습니다.
$ 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
설정되고, 그렇지 않으면 동작이 입력됩니다. 그런 다음 다음 섹션이 시작될 때까지 입력 라인이 인쇄됩니다. 이렇게 하면 파일 끝에 있는 부분도 처리됩니다.1
0
data 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