![선택한 문자열을 다음으로 구분하여 잡는 방법 -](https://linux55.com/image/202422/%EC%84%A0%ED%83%9D%ED%95%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EB%8B%A4%EC%9D%8C%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EB%B6%84%ED%95%98%EC%97%AC%20%EC%9E%A1%EB%8A%94%20%EB%B0%A9%EB%B2%95%20-.png)
저는 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