텍스트의 특정 부분을 검색하는 방법은 무엇입니까? - grep/정규식

텍스트의 특정 부분을 검색하는 방법은 무엇입니까? - grep/정규식

텍스트 파일에서 특정 정보를 검색해야 합니다.

Barnes and Kolling, 9780131976290,480, Pearson, Objects First with Java, LM002411,3989,781,true
Aho Sethi and Ullman, 9780201101942,795, Addison-Wesley, Compilers: Principles Techniques and Tools, LM002711,599,0,FALSE
Harvey Paul and Jeffrey, 9780130622211,1568, Prentice Hall, C# How to Program, LM002876,4599,45,TRUE
Muster, 9780072193145,1011, McGraw-Hill, Unix Made Easy: The Basics and Beyond (Made Easy), LM002468,6395,0,TRUE
Thomee, 9783540331216,370, Springer Verlag, Galerkin Finite Element Methods for Parabolic Problems, LM002153,4554,0,FALSE 

검색할 정보:

자바 객체 먼저

컴파일러: 원리, 기술 및 도구

C# 프로그래밍 방법

Unix Made Easy: 기본 및 그 이상(Made Easy)

포물선 문제에 대한 Galerkin 유한 요소 방법

답변1

cut -d , -f 5 FILE

필요한 결과를 만들어낼 것입니다. 그러면 쉼표 구분 기호로 구분된 다섯 번째 열이 표시됩니다.

답변2

데이터 필드에 쉼표나 개행 문자가 포함되어 있지 않다고 가정할 때 가장 간단한 해결책은 를 사용하는 것입니다. cut -d , -f 5 file이 경우 남겨질 초기 공백 문자를 제거하기 위해 약간의 후처리가 필요할 수 있습니다( sed 's/^[[:blank:]]*//'이러한 공백 문자는 제거됩니다).

이 옵션을 이해하는 grep비표준 변형이 없으면 데이터를 추출할 수 없습니다 . 기준만 일치 항목 추출grep-ogrep철사파일에서.

특정 필드를 일치시키기 위해 정규식을 사용하는 것은 지루하며 종종 특수 사례가 발견되자마자 중단되는 읽을 수 없는(따라서 유지 관리할 수 없는) 코드가 생성됩니다.

cut이런 경우에는 위나 awk(아래) 처럼 입력을 별도의 필드로 나눌 수 있는 방법을 아는 도구를 사용하는 것이 좋습니다 . 데이터가 실제로 CSV 파일인 것으로 밝혀지면 유틸리티를 조사해 볼 수 있습니다 csvkit. CSV는 , 및 와 같은 간단한 도구를 처리하는 데 어려움을 겪는 특별한 csvcut인용 및 인코딩 규칙이 있는 구조화된 형식이기 때문입니다 .grepsedawk


awk -F ',[[:blank:]]*' '{ print $5 }' file

이것정규 표현식 사용데이터의 구분 기호를 지정합니다(쉼표 뒤에 선택적 공백이 옴). 다섯 번째 필드가 추출되어 각 행에 인쇄됩니다.

이는 삽입된 쉼표(또는 개행)가 포함된 필드가 없다고 가정합니다.

문제에 입력이 주어지면 다음이 생성됩니다.

Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems

다음과 같이 GNU를 사용할 수도 있습니다 sed.

tr ',' '\n' <file | sed '5~9!d; s/^[[:blank:]]*//'

이는 모든 쉼표를 개행 문자로 바꾸고 5번째 줄부터 시작하여 9번째 줄마다 인쇄합니다(실제로는삭제이 줄 각각이 아니라 나머지 줄을 인쇄합니다). ㅏ정규 표현식 사용인쇄하기 전에 각 줄의 시작 부분에서 초기 공백을 제거하십시오.


재미로:

실제로 행당 9개의 필드로 구성된 중간 필드를 원하므로 첫 번째와 마지막 필드를 제거하고 더 이상 제거할 필드가 없을 때까지 이를 반복할 수 있습니다.

s/^[^,]*,//in을 사용하여 시작 부분의 필드를 삭제할 수 sed있고 in을 사용하여 끝 부분의 필드를 삭제할 수 있습니다 s/,[^,]*$//. 가장 최근 명령이 변경된 경우 해당 명령은 t지정된 레이블로 분기됩니다. 이 명령은 레이블을 도입합니다.seds///:

$ sed -e ': again' -e 's/^[^,]*,//; s/,[^,]*$//' -e 't again' -e 's/^[[:blank:]]*//' file
Objects First with Java
Compilers: Principles Techniques and Tools
C# How to Program
Unix Made Easy: The Basics and Beyond (Made Easy)
Galerkin Finite Element Methods for Parabolic Problems

답변3

귀하의 제목 뒤에 가 있다고 가정합니다 LM.... 다음은 귀하에게 적합한 정규식입니다.

sed "s/\([^,]*, *\)\{4\}\(.*\), LM.*/\2/" booksdata

데이터는 파일에 포함되어 있습니다 booksdata. 정규식은 끝에 선택적 공백으로 구분된 \([^,]*, *\)\{4\}4개의 필드 인스턴스를 캡처합니다 . ,사용은 LM...책 제목에 쉼표를 허용합니다.

관련 정보