는 방법을 사용하지 않도록 설정할 수 있습니 변 보간으로 Perl 대체 operator?

StackOverflow https://stackoverflow.com//questions/12678519

  •  12-12-2019
  •  | 
  •  

문제

내가 노력하고 바꾸기에서 특정 행 텍스트 파일로서 VM.일반적으로,이것은 단순한 하나-라이너와 Perl.하지만 나는 문제로 실행할 때는 교체 측 상징이었을 포함하는 VM 이 경로에 있습니다.여기에서 파일을 내가 무엇을 시도한다:

내용 file1.txt:

foo
bar
baz
quux

도를 대신 3 번째 줄:

$ mysub = "disk$data1:[path.to]file.txt"
$ perl -pe "s/baz/''mysub'/" file1.txt

하면 다음과 같은 출력이 생성됩니다:

foo
bar
disk:[path.to]file.txt
quux

그것은 다음과 같 Perl 었다 열심이 지나친 대체 $data1 일부의 경로와의 내용은 존재하지 않는 변수(즉,아무것도).실행하는 디버거를 확인한다.지 않았 공급 /e, 다,그래서 나는 생각 Perl 한,대체 텍스트입니다.이 있을 얻을 수 있는 방법 Perl 는 그렇게 하라고 하셨을까?

(또한 참고할 수 있는 재현하는 유사한 문제에서 리눅스 명령 라인입니다.)

도움이 되었습니까?

해결책

과의 혼합 시세 및따옴표를 얻을 수 있습기:

우리가 만든 단단한 연결의"문자열"+'대신 상징'+"문자열".두 개의 인용된 문자열을 포함하는 작은 따옴표에 대한 대체물이다.인위적인...하지만 그것을 작동합니다.

$ perl -pe "s'baz'"'mysub'"'" file1.txt

는 DCL 수준 솔루션입니다.

에 대한 Perl 솔루션 q() 운영자에 대한 비 삽입된 문자열 및 실행가.재료의 상징으로 괄호를 사용하여 간단한 DCL 체.이것은 내가 좋아하기 때문에 그것은(almost)의미하지 않을 얻을 너무 혼란으로 인용한다.

$ perl -pe "s/baz/q(''mysub')/e" file1.txt

다른 팁

ruakh 견을 읽을 때 내 주석,문제의 펄 보간하여 해결할 수 있습니다 액세스하기 %ENV 해시 사용하기보다는 쉘 변:

perl -pwe "s/baz/$ENV{mysub}/" file1.txt

추가 -w 하지 않기 때문에 믿는 사용하지 않는 warnings 도에 강선이 있습니다.

지는 VM 이 시스템에서 수십 년 동안,하지만...출 인장은?

$ mysub = "disk\$data1:[path.to]file.txt"

또 어쩌면

$ mysub = "disk\\$data1:[path.to]file.txt"

?

sh 또는 파생상품,나는 사용

perl -pe'BEGIN { $r = shift(@ARGV) } s/baz/$r/' "$mysub" file1.txt

그렇지 않으면,당신은 어떻게든 비밀의 가치 mysub 로 Perl 문자열이다.는 것은 더 복잡합니다.찾기 상당한 쉘입니다.

편집 OP:

예,이 작품이다.VM 이와 동등한

perl -pe "BEGIN { $r = shift(@ARGV) } s/baz/$r/" 'mysub' file1.txt

당신은 탈출 $\$.그렇지 않으면 Perl 는 변수를 참조하고 대체 문자열 $data1 콘텐츠 $data1 하기 전에 정규 표현식을 평가합니다.당신이 정의하지 않은 $data1 그것은,물론,비어 있습니다.

다음을 사용할 수 있습니다 코드:

$ mysub='disk\$data1:[path.to]file.txt'
$ perl -pe 's/baz/'$mysub'/' FILE
foo
bar
disk$data1:[path.to]file.txt
quux

당신이 시도할 수 있습 논리합을 사용하여 대신 이름의 DCL 호:

$ define mysub "disk$data1:[path.to]file.txt"
$ $ perl -pe "s/baz/mysub/" file1.txt

사용 sed.

Sed 하려고 시도하지 않으 보간 $data1 로 변수,그래서 당신은 당신이 원하는 것을 얻을.

$ sed -e "s/baz/''mysub'/" file1.txt
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top