이 Perl 스크립트가 git-for-windows 및 Linux의 Windows 하위 시스템과 다른 결과를 제공하는 이유는 무엇입니까?

이 Perl 스크립트가 git-for-windows 및 Linux의 Windows 하위 시스템과 다른 결과를 제공하는 이유는 무엇입니까?

git-for-windows를 통해 동일한 perl 스크립트를 실행할 때와 Windows 스크립트 호스트(VBA 모듈에서)를 통해 실행할 때 다른 결과를 얻습니다.

Perl 명령은 다음과 같습니다.

perl -pi -e 's/\bxlYes\b([^(\n|\r|\x27]*)/1$1 \x271=xlYes;/' -- *.*

그 목적은 주어진 상수를 긴 값으로 대체한 다음 정보 주석을 추가하는 것입니다.

위 명령은 git-for-windows에서 완벽하게 작동합니다. 예를 들어 다음 코드 줄은 다음과 같습니다.

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , xlYes)

...다음과 같이 (정확하게) 됩니다:

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , 1) '1=xlYes;

Windows 스크립트 호스트(VBA)를 통해 동일한 명령을 실행할 때 다음과 같이 명령을 래핑해야 합니다.

bash -c "perl -pi -e 's/\bxlYes\b([^(\n|\r|\x27]*)/1$1 \x271=xlYes;/' -- *.*"

그러나 이렇게 하면 동일한 코드 줄이 나타납니다.

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , xlYes)

...다음과 같이 (잘못) 됩니다:

Set ListObject = Worksheet.ListObjects.Add(xlSrcRange, rng, , 1 '1=xlYes;

(누락된 닫는 괄호에 유의하세요).

버전 문제일 수도 있나요?


git-for-windows: bash 버전 4.4.23(1)-release; Linux
Windows 하위 시스템용 perl v5.30.2: bash 버전 4.4.20(1)-release;

(이 질문에 대한 올바른 포럼이 아니라면 용서해주세요.)

답변1

[^\n\r\x27]@ruud에게 감사드립니다. 대신 사용해야 합니다.[^(\n|\r|\x27]

@Rakesh Sharma에게 감사드립니다. $1큰따옴표 래퍼로 탈출하여 트릭을 수행했습니다.

날것의:

perl -pi -e 's/\bxlYes\b([^\n\r\x27]*)/1$1 \x271=xlYes/' -- basAggregate.bas

포장 포함:

bash -c "perl -pi -e 's/\bxlYes\b([^\n\r\x27]*)/1\$1 \x271=xlYes/' -- basAggregate.bas"

도움을 주신 모든 분들께 진심으로 감사드립니다!

관련 정보