여러 줄에 grep 문을 작성할 수 있습니까?

여러 줄에 grep 문을 작성할 수 있습니까?

한 줄에 하나의 패턴을 작성하여 스크립트를 더 읽기 쉽게 만들고 싶습니다.

grep 'foo\|bar\|barz'아래와 같이 변환할 수 있는 구문이 있습니까 ?

grep 'foo\|
      bar\|
      barz'

답변1

패턴 매개변수는 실제로 줄바꿈으로 구분된 패턴 목록입니다. 이는 다음의 경우에도 마찬가지입니다 grep -F. 여러 문자열을 검색할 수 있습니다. 따라서 다음과 같이 작성할 수 있습니다.

grep 'foo
bar
barz'

그러나 연속된 줄은 들여쓰기하면 안 됩니다. 선행 공백은 패턴의 일부가 됩니다. 따라서 패턴 목록을 -e각 패턴 앞에 별도의 인수로 전달하는 것이 좋습니다 . 그런 다음 \줄 끝에서 at을 사용하여 명령 인수 사이의 줄에 걸쳐 쉘 명령을 분할 할 수 있습니다 grep. 두 구문 모두 동일합니다.

grep -e 'foo' \
     -e 'bar' \
     -e 'barz'

grep옵션을 전달할 때 -P(PCRE 정규식의 경우) 이들 중 어느 것도 현재 버전의 GNU에서 작동하지 않으며 이러한 경우 표시에 실패합니다 . 그러나 GNU 대신 grep: the -P option only supports a single pattern사용할 수 있으며 플래그를 사용하여 여러 줄을 입력할 수 있습니다.pcregrepgrep -Px

pcregrep '(?x)
  foo |
  bar |
  barz'

를 사용하면 (?x)모든 공백 문자(SPC 및 NL 포함)가 무시되므로 필요에 따라 코드를 들여쓸 수 있습니다.

답변2

나는 그것이 필요하다고 생각하지 않는다 |. -e행 전체에 걸쳐 여러 옵션을 사용할 수 있습니다 .

grep -e foo \
     -e bar \
     -e barz

답변3

Raku(이전 Perl_6) 사용

$ cat foo_bar_barz.txt | raku -ne '.grep(/
| foo
| bar
| barz
/).put;'

#산출:

1. foo
2. bar
3. barz

Perl6(현 Raku) 프로젝트의 주요 이유 중 하나는 더 읽기 쉬운 코드를 입력할 수 있도록 정규식 엔진을 다시 작성하는 것이었습니다. Raku 기본값에는 토큰 사이에 공백 삽입, 여러 줄에 정규식 작성, 수정된 버전의 "수정자" 시스템(현재는 "부사"라고 함)이 포함됩니다. [후자의 예를 들면, 정규식 끝에 "g"를 태그했는데 이제는 ":g"가 정규식의 시작 부분에 나타나므로 처음부터 무엇을 일치시킬지 알 수 있습니다.]

위는 귀하가 게시한 예에 대한 Raku 솔루션입니다. Raku에서는 |교체 연산자가 LTM(Longest Token Match) 정책을 구현합니다. 또한 선택적으로 "선행" |대체 연산자를 삽입하여 토큰을 정렬하는 데 도움을 줄 수 있습니다(위 참조). 라쿠는 이것이 정상이라고 생각합니다.

아래에서는 뒤에서 무슨 일이 일어나고 있는지 알려드리기 위해 m//세 개의 태그를 개별적으로 캡처하는 대신 일치 연산자를 사용하고 있습니다 grep(). 캡처는 괄호를 통해 수행되며 번호는 다음부터 시작됩니다 $0.

$ cat foo_bar_barz.txt | raku -ne 'say  m/
| (foo)
| (bar)
| (barz)
/;'

#산출:

「foo」
 0 => 「foo」
「bar」
 0 => 「bar」
「barz」
 0 => 「barz」
Nil

입력 파일은 다음과 같습니다(솔직하게 설명하기 위해 끝에 가짜 줄이 있음).

$ cat foo_bar_barz.txt
1. foo
2. bar
3. barz
4. ziggy

https://raku.org/

관련 정보