grep에서 새 줄에 패턴을 제공하는 방법은 무엇입니까?


95

grep에서 새 줄에 패턴을 제공하는 방법은 무엇입니까? 처음에는 새 줄, 끝에는 새 줄. 정규식 방식이 아닙니다. \ n 같은 것.


6
당신이 원하는 것이 무엇인지 명확하지 않습니다. new line at the beginning빈 줄이며 new line at end파일의 모든 줄에 적용됩니다. 예제를 게시 할 수 있습니까?
PP

2
실제로 $. 다소 제한적이지만 간단한 경우에 사용할 수 있습니다.
Krzysztof Jabłoński 2014

답변:


84

grep 패턴은 개별 줄과 일치하므로 패턴이 입력에서 찾은 줄 바꿈과 일치 할 방법이 없습니다.

그러나 다음과 같은 빈 줄을 찾을 수 있습니다.

grep '^$' file
grep '^[[:space:]]*$' file # include white spaces 

적어도 GNU grep에는 grep이 널 문자로 줄을 나누는 -z 옵션이 있습니다. 그러나 개행 문자와 일치하는 패턴에서 개행 문자 또는 \ n을 지원하지 않는 것 같습니다 . 버그 보고서를 참조하십시오 .
jarno

1
@jarno이 지원 \ n은 -P 플래그 패턴
rubystallion

92

pcregrep일반 대신 시도하십시오 grep.

pcregrep -M "pattern1.*\n.*pattern2" filename

-M옵션을 사용하면 여러 줄에 걸쳐 일치시킬 수 있으므로 개행 문자를 \n.


22

이런 식으로 사용할 수 있습니다 ...

grep -P '^\s$' file
  • -PPerl 정규 표현식에 사용됩니다 (POSIX 확장 grep).
  • \s공백 문자와 일치합니다. 뒤에이면 *빈 줄도 일치합니다.
  • ^줄의 시작과 일치합니다. $줄의 끝과 일치합니다.

2
-PGNU 확장입니다. 나는 상황이 그것을 요구할 때 그것을 사용하는 것이 좋지만 (일반적으로 lookahead / lookbehind) POSIX grep은 [[:space:]].
jordanm

1
FWIW, Solaris '및 BSD의 grep 맨 페이지 (다른 항목을 확인하지 않음)에는 모두 -P. GNU는 어쨌든 꽤 표준입니다. :)
K3 --- RNC

1
매뉴얼 페이지에서 : [-P]이 옵션은 FreeBSD에서 지원되지 않습니다.
Marián Černý

MacOsX에 대한 [-P] 없음 : grep [-abcdDEFGHhIiJLlmnOopqRSsUVvwxZ] [-A num] [-B num] [-C [num]] [-e pattern] [-f file] [--binary-files = value] [--color [= when]] [--colour [= when]] [--context [= num]] [--label] [--line-buffered] [--null] [pattern] [file. ..]
Niccolò

@ Niccolò brew install grep여러면에서 우수한 GNU grep을 얻고 싶을 것 입니다. apple.stackexchange.com/questions/193288/…
herdrick

19

@jarno 덕분에 나는 -z 옵션에 대해 알고 있으며 -P 옵션과 함께 GNU grep을 사용할 때 일치하는 \n것이 가능하다는 것을 알았습니다 . :)

예:

grep -zoP 'foo\n\K.*'<<<$'foo\nbar'

인쇄물 bar


1
좋습니다. 답변에서 "@jarno"에 대한 알림을받지 못합니다.
르노

3
이것은 대단합니다! 공유 해주셔서 감사합니다!
Alicia Tang

6

해결 방법 (non-portable을 사용하지 않음)에 관해서는 -P개행 문자를 임시로 다른 문자로 바꾸고 다시 변경할 수 있습니다. 예 :

grep -o "_foo_" <(paste -sd_ file) | tr -d '_'

기본적으로 그것은 정확히 일치 찾고 _foo__수단을 \n(너무 __= \n\n). tr '_' '\n'어쨌든 각 패턴이 새 줄에 인쇄 되므로으로 다시 번역 할 필요가 없으므로 제거 _하면 충분합니다.


내 무지를 용서하지만 아직 다른 NON posix 호환이 아닌 프로세스 대체를 사용하고 있으므로 이식 불가능한 기능입니까? posix 쉘에서 할 수 <(p paste -sd_ file )없습니까?
humanityANDpeace

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.