패턴과 일치하는 여러 문자열을 grep

패턴과 일치하는 여러 문자열을 grep

다양한 버전의 deb 디렉토리 목록이 있습니다. 내 요구 사항은 일치하는 버전의 패키지를 찾는 것입니다.

내가 지금까지 시도한 것은 다음과 같습니다.

ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'

위 명령은 Package1의 o/p만 제공합니다.

모두 시도했다옵션여기에서. 그러나 그들 중 누구도 도와주지 않았습니다.

답변1

첫 번째,구문 분석하지 않음에 대한 일반 경고ls. 즉, 파일 이름이 적절하게 지정되었다고 가정하면 다음과 같이 할 수 있습니다.

ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'

여기서 유일한 차이점은 첫 번째 grep을 사용하지 않았다는 것입니다. 이는 glob 패턴을 직접 전달할 수 있기 때문에 불필요합니다 ls. 그런 다음 egrep더 이상 사용되지 않는 것을 사용했는데 grep -E똑같습니다.

그러나 이는 기본적으로 명령과 동일합니다. 그래도 작동하지 않으면 일치하는 파일이 없는 것입니다.

$ ls debs/
1.1.16.Package3  Package1.1.1.160  Package1.1.2.16  Package2.1.1.16
$ ls debs/*1.1.16* | grep -E 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16

예상대로 두 개의 일치하는 파일이 표시됩니다. 이것이 바로 명령이 인쇄하는 내용입니다.

$ ls debs/* | grep 1.1.16 | egrep -e 'Package1|Package2|package3'
debs/Package1.1.1.160
debs/Package2.1.1.16

스키마 package3가 소문자( p대신 P) 이므로 grep파일이 표시되지 않습니다.1.1.16.Package3

답변2

ls출력을 자르지 않고 이를 수행하는 방법이 있습니다 .

version=1.1.16
for package in debs/*Package1*${version}* \
               debs/*Package2*${version}* \
               debs/*package3*${version}*;
do
  action with $package;
done

그런 다음 쉘은 glob을 확장하고 일치하는 파일을 반복합니다. 제공된 패턴과 일치하는 파일이 없으면 스크립트는 오류 없이 루프를 건너뜁니다.

아니면 다음을 시도해 보세요 find:

version=1.1.16
find debs/ \( -name "*Package1*${version}*" -o -name "*Package2*${version}*" -o -name "*package3*${version}*" \)

관련 정보