텍스트 묶음을 가지고 있고 패턴 그룹과 일치 시키려고합니다. 사용하고있는 정규식은 패턴과 일치 할 수 있지만 문제는 두 번째 그룹 만 일치한다는 것입니다. 첫 번째 그룹.Perl 정규식 복수 멀티 라인 그룹과 일치합니다.
open(FILE, "match.txt") || die("Could not open file ");
my $text = do { local $/; <FILE> };
while($text =~ m/FibreChannel SCSI Interface.*World Wide Port Number\.*(.*?)\n.*Driver\.+(.*?)\n.*Vendor Name\.+(.*?)\n/sgmp)
{
print "$1\n$2\n$3\n";
}
인쇄
0x1b201
lpfc_740
테스트 공사
위의 코드가 작동을하지만이 두 번째 그룹이 아닌 첫 번째 그룹에서 텍스트 만 표시
. 내가 여기서 무엇을 놓치고 있니? 이 작업을 수행하는 더 좋은 방법이 있습니까?내가 그것을
0x1a101
lpfc_740
테스트 공사 인쇄 것이라고 생각
0x1b201
lpfc_740
테스트 공사
--------------- --------- match.txt에는 다음이 포함됩니다.
\==+FibreChannel SCSI Interface :
|----Link State.........................................Down
|----World Wide Port Number.............................0x1a101
\==+SCSI Interface :
|----Driver..........................................lpfc_740
|----Queue Depth.....................................2038
\==+PCI Device :
|----Bus..........................................0x06
|----Vendor Name..................................Test Corporation
|----Slot Description.............................
\==+FibreChannel SCSI Interface :
|----Link State.........................................Down
|----World Wide Port Number.............................0x1b201
\==+SCSI Interface :
|----Driver..........................................lpfc_740
|----Queue Depth.....................................2038
\==+PCI Device :
|----Bus..........................................0x0a
|----Vendor Name..................................Test Corporation
|----Slot Description.............................
어떻게해야합니다. *합니다. *? 모든 인스턴스에 대해 이제 두 번째 그룹이 아닌 첫 번째 그룹이 생성됩니다. 나는 왜 내가 두 그룹을 얻을 수 없는지 아직도 알 수 없다. – Sumedh
세 곳에서 모두 변경하셨습니까? '$ 2'와'$ 3'가 두 그룹에서 동일하게 보이기 때문에'. *'을 한 곳에 그대로 남겨두면 첫 번째 그룹 만 일치하는 것처럼 보이게됩니다. 사실, 정규 표현식이 두 그룹과 실제로 일치 할 때 함께. – ruakh
ruakh, 당신은 신들 가운데 남자입니다. 고마워, 내가 바보 같은 실수를 저질렀다는 것을 알았다. – Sumedh