단일 라인의 개별 라인 또는 패턴 사이를 Grep합니다.

단일 라인의 개별 라인 또는 패턴 사이를 Grep합니다.

그래서 나에게 필요한 것은 내 일치 패턴 사이(및 포함) 사이의 텍스트만 grep하는 것입니다.

다음과 같은 것입니다(텍스트는 신경 쓰지 마세요. 단지 횡설수설일 뿐입니다 :D):

asdgfasd gasd gdas g This will be this one day ksjadnbalsdkbgas asd gasdg 
asdgasdgasdg dasg dasg dasg This will be this next day adf gdsf gdsf sdfh dsfhdfsh
asdf asdf asd fesf dsfasd f This will won' not this day asdgadsgaseg as dvf as d vfa se v asd
dasfasdfdas fase fasdfasefase fasdf This not what shoes day asdjbna;sdgbva;sdkbcvd;lasb ;lkbasi hasdli glais g

그래서 내가 원하는 것은 이것이다: cat theabovetext|grep -E "^This * day$" 출력:

This will be this one day
This will be this next day
This will won' not this day
This not what shoes day

따라서 기본적으로 저는 "This"와 "Day" 사이("This"와 "day" 포함) 사이에 문자 수나 "This" 앞과 "Day" 뒤에 몇 개의 문자가 있는지에 관계없이 텍스트를 가져오고 싶습니다. 성격. 입력이 모두 한 줄에 있는 경우에도 작동해야 하므로 다음과 같습니다.

asdgfasd gasd gdas g This will be this one day ksjadnbalsdkbgas asd gasdg asdgasdgasdg dasg dasg dasg This will be this next day adf gdsf gdsf sdfh dsfhdfsh asdf asdf asd fesf dsfasd f This will won' not this day asdgadsgaseg as dvf as d vfa se v asd dasfasdfdas fase fasdfasefase fasdf This not what shoes day asdjbna;sdgbva;sdkbcvd;lasb ;lkbasi hasdli glais g

다음과 같이 출력되어야 합니다.

This will be this one day This will be this next day This will won' not this day This not what shoes day

여기서 출력은 여전히 ​​한 줄에 있습니다.

답변1

GNU를 사용하면 grep다음을 수행할 수 있습니다.

grep -o 'This.*day' theabovetext

( 파일을 읽는 방법을 알고 있으므로 cat그럴 필요는 없습니다 .)grep

-o플래그는 패턴과 일치하는 행 부분만 표시됨을 나타냅니다.

다른 버전에서도 이 플래그를 지원하는 것 같지만 grepPOSIX에는 없으므로 반드시 이식 가능한 것은 아닙니다.

답변2

행을 개별적으로 처리하고 싶지만(첫 번째 예) 한 줄에 여러 개의 일치 항목을 출력하는 경우(두 번째 예) grep개별적으로 처리하는 것은 불가능하다고 생각합니다.

그러나 Perl 자체에서 동일한 비탐욕적 일치를 사용하면 This.*?day다음을 수행할 수 있습니다.

$ perl -lne 'print join " ", /This.*?day/g' theabovetext1
This will be this one day
This will be this next day
This will won' not this day
This not what shoes day

그리고 단일 라인 입력의 경우

$ perl -lne 'print join " ", /This.*?day/g' theabovetext2
This will be this one day This will be this next day This will won' not this day This not what shoes day

답변3

Eric Reinoff의 답변이 대부분의 작업을 수행했습니다. Steeldriver의 주석은 탐욕스럽지 않게 만들어 특정 줄의 추가 텍스트를 제거합니다.

따라서 다음과 같습니다. grep -oP 'This.*?day' theabovetext출력이 여러 줄에 있다는 점을 제외하고 원하는 모든 작업을 수행하십시오.

한 줄에 출력을 넣으려면 이렇게 하면 됩니다 grep -oP 'This.*?day' theabovetext | tr '\n' ' '. 이 추가는 개행*을 공백으로 대체합니다.

*이렇게 하면 모든 출력 개행 문자가 공백으로 대체됩니다. 따라서 초기 입력이 줄로 구분되어 있으면 이러한 개행 문자는 손실됩니다.

관련 정보