텍스트 처리 - 주어진 단어 앞/뒤의 텍스트 찾기

텍스트 처리 - 주어진 단어 앞/뒤의 텍스트 찾기

Station Name파일 과 Data End파일 내용 사이에서 추출하고 싶습니다 .

설명을 위한 텍스트 파일 구조:

---- Huge text -- not interested
Station Name 
100 - 200 lines
Data End
---- Again text --- 

어떻게 데이터를 쉽게 추출할 수 있나요?

일반적으로 데이터의 특정 부분을 찾아서 이를 처리(제거/교체 등)하려면 어떻게 해야 합니까? 즉, 특정 단어 앞입니까? 아니면 특정 단어 뒤에? 아니면 그들 사이?

원하는 출력

사례 1:처음부터 주어진 단어/패턴까지
사례 2:주어진 2개의 단어/패턴 사이
사례 3:주어진 단어/패턴부터 파일 끝까지.

답변1

sed '/Station Name/,$!d; /Data End/q'

즉, "역명"이 포함된 첫 번째 줄과 마지막 줄($)을 제외한 모든 줄을 삭제합니다. 그런 다음 명령이 이스케이프된 행에 대해 d"Data End"와 일치하면 종료합니다(그러나 종료하기 전에 인쇄하십시오).

따라서 "Station Name"의 첫 번째 발생과 "Data End"의 첫 번째 발생 사이의 줄을 인쇄합니다("Data End"와 동일한 줄에 있는지 여부 포함).

이제 테두리를 무시하려면 더 복잡해집니다.

sed -ne '1,/Station Name/d; /Data End/!{p;n;}' -e q

"Station Name"이 첫 번째 줄에 있거나 "End of Data"와 같은 줄에 있지 않으면 유효합니다. 일부 구현에서는 행 범위 내의 행을 sed참조할 수 있지만 이는 이식 가능하지 않습니다. 0그러나 해결책이 있습니다. sed FAQ를 참조하세요.

"역 이름"과 "역 이름" 사이에 처음 나타나는 텍스트를 찾으려면 상황이 더 복잡해집니다.마지막"데이터 끝"이 발생하는 이유는 이 경우 파일 끝에 도달하기 전에 마지막 "데이터 끝"에 도달했는지 확신할 수 없기 때문입니다. sed는 파일 끝까지 또는 다음에 "데이터 끝"이 발생할 때까지 "데이터 끝"을 확인한 후 표시되는 행을 유지해야 하며 POSIX에서는 10줄 이상의 입력을 유지하기 위해 sed 구현을 요구하지 않기 때문입니다. , 이식성이 없으므로 sedPerl이나 awk와 같은 다른 도구를 사용하거나 파일에 여러 번 패스해야 합니다.

답변2

사용행복하다(이전 Perl_6)

출력 파일은 시작부터 "sentinel" 줄까지(포함하지 않음) 모든 줄입니다.

~$ raku -e 'my Str $K1 = "Station Name"; put slurp.split($K1)[0];'   file
---- Huge text -- not interested

#OR:

~$ raku -ne 'BEGIN my @a; @a.push: $_ unless /Station \s Name/ && last; END .put for @a;'   file
---- Huge text -- not interested 

#OR:

~$ raku -ne '.put unless /Station \s Name/ fff *;'   file
---- Huge text -- not interested

두 개의 "sentinel" 라인 사이(및 포함)의 출력 라인(참고 - 장소필터링이 "시작 줄/끝 줄" 패턴을 만족하는 여러 레코드):

~$ raku -ne '.put if  /Station \s Name/ fff /Data \s End/;'  file  
Station Name 
100 - 200 lines
Data End

"sentinel" 줄부터 파일 끝까지(제외) 파일의 모든 줄을 출력합니다.

~$ raku -e 'my Str $K2 = "Data End\n"; put slurp.split($K2, 2)[1];'   file 
---- Again text --- 

#OR:

~$ raku -ne '.put if /Data \s End/ ^fff *;'   file
---- Again text --- 

참고: Raku의 "트리거" 연산자 에는 추가 및 변형 연산자 / … / fff / … /뿐만 아니라 여러 옵션이 있습니다 . 캐럿은 식별된 행이 반환 값에 나타나지 않음을 나타냅니다(문이 부정되지 않는 한).^ffffff^^fff^^

입력 예:

---- Huge text -- not interested
Station Name 
100 - 200 lines
Data End
---- Again text --- 

https://docs.raku.org/언어/operators#infix_fff
https://raku.org

관련 정보