저는 grep을 처음 사용하고 있으며 패키지 목록이 있고 특정 결과만 표시하면 됩니다.
패키지 목록은 다음과 같습니다.
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-dbg/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-doc/oldoldstable,oldoldstable 2.4.25-3+deb9u12 all
apache2-ssl-dev/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-custom/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-suexec-pristine/oldoldstable,oldoldstable 2.4.25-3+deb9u12 amd64
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
정규식을 사용하려고 노력했지만 뭔가 잘못된 것이 확실합니다.
cat list | grep 'apache2-(bin|data|utils)'
이것이 내 예상 결과입니다.
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
내 명령에 무엇이 잘못되었거나 누락되었나요?
답변1
|
기본값인 BRE(Basic Regular Expressions) 패턴 일치를 사용하는 경우 이스케이프 대괄호와 문자가 필요합니다.grep
, 그래서:
grep '^apache2-\?\(bin\|data\|utils\|\)/'
-E
또는 스위치와 일치하는 ERE(확장 정규식) 패턴을 활성화합니다 .
grep -E '^apache2-?(bin|data|utils|)/'
노트:
- 다른 많은 도구처럼 파일에서 직접 읽기 때문에 피드를
grep
사용할 필요가 없습니다 .cat
^
줄의 시작 부분과 일치하도록 줄의 시작 부분을 추가했습니다 .- 하이픈과 0번 또는 한 번만 일치하는
-?
ERE 및 BRE를-\?
추가했습니다 . 또한 사용된 표준 BRE는 작동하지 않습니다(적어도 GNU 또는 다른 도구에서는 작동하지만). BRE 는 .-
\?
\?
\{0,1\}
|
빈 마지막 일치 항목을 추가하면 행 을 포함하는 것과 같은 항목(...|...|...|)
과 일치합니다apache2
(그러나 입력에 아무 것도 포함되어 있으면 일치하지만apache2-
일치하지 않으려면grep -E '^apache2(-(bin|data|utils)|)/'
대신 사용하세요).- 사용되는 것도
\|
표준 BRE가 아니며 이에 상응하는 것도 없습니다. ERE에서 제공하는 대안을 사용하는 것이 좋습니다.
당신은 또한 볼 수 있습니다내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?
답변2
이 시도:
grep -Ex 'apache2(-(bin|data|utils))?' list
산출:
apache2
apache2-bin
apache2-data
apache2-utils
이런, 질문이 바뀌었습니다 :).
grep -E 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list
산출:
apache2/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed]
apache2-bin/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
apache2-data/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 all [installed,automatic]
apache2-utils/oldoldstable,oldoldstable,now 2.4.25-3+deb9u12 amd64 [installed,automatic]
그러면 -x(정확히 일치)가 필요하지 않습니다.
-E 스위치 대신 egrep을 사용할 수 있습니다.
egrep 'apache2(|/|(-(bin|data|utils)))?([^-]|$)' list