선택한 문자열을 다음으로 구분하여 잡는 방법 -

선택한 문자열을 다음으로 구분하여 잡는 방법 -

저는 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

관련 정보