순전히 정규식을 사용하기 위한 목적으로 쉘 스크립트를 Perl로 보완하는 것이 좋은 생각입니까?

순전히 정규식을 사용하기 위한 목적으로 쉘 스크립트를 Perl로 보완하는 것이 좋은 생각입니까?

나는 모든 시스템이 grep에 내장된 Perl 확장을 가지고 있지 않은 UNIX 쉘 스크립트에서 정규식을 사용하는 간단한 방법을 찾고 있습니다. 여기에서 Perl 정규식에 대해 정말 유용한 점은 뒤로/앞으로 참조인데, sed에서 효과적으로 사용할 수 있는 방법을 찾지 못했습니다. 나는 다음과 같은 한 줄을 빨리 생각해 냈습니다.

tail --bytes=+K something.log| perl -e 'while (my $line = <STDIN>){if ($line =~ /$ARGV[0]/){print $line};}' 'my regex'

Q1. 이것은 Perl에서 작업을 수행하는 안전한 방법입니까? Q2. 전체 스크립트를 Perl로 작성해야 합니까?

답변1

귀하의 Perl 코드 조각이 왜 이렇게 작성되었는지 이해할 수 없습니다. 스크립트에서 직접 정규식을 작성할 수 있습니다.

perl -e 'while (my $line = <STDIN>) {if ($line =~ /my regex/) {print $line}}'

이를 통해 해당 옵션을 활용할 수 있습니다 -n(보너스로 입력 오류가 발생할 경우 적절한 오류 보고를 받을 수 있습니다). Perl 관용구의 추가 사용법:

perl -ne 'print if /my regex/'

Sed에는 역참조가 있지만 Perl의 확장 정규식은 더 강력하며 sed로 수행할 수 없는 몇 가지 작업이 있습니다(sed에는 완전한 정규식조차 없습니다. 대체는 \|많은 구현에 있지만 표준 기능은 아닙니다).

기존 도구를 사용하여 수행할 수 있는 대부분의 작업은 Perl에서 쉽게 수행할 수 있습니다. 예를 들어, 처음 K-1 바이트를 건너뛰려면 다음과 같이 쓸 수 있습니다.

perl -ne 'BEGIN {read ARGV, "", 42-1}; …'

이식성을 원한다면 awk에서 많은 텍스트 처리 작업을 수행할 수 있지만 awk에는 역참조가 전혀 없으므로 문자열에서 텍스트를 추출하는 것이 서투를 수 있습니다.

관련 정보