한 줄에 하나의 패턴을 작성하여 스크립트를 더 읽기 쉽게 만들고 싶습니다.
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
사용할 수 있으며 플래그를 사용하여 여러 줄을 입력할 수 있습니다.pcregrep
grep -P
x
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