는 방법을 사용하지 않도록 설정할 수 있습니 변 보간으로 Perl 대체 operator?
문제
내가 노력하고 바꾸기에서 특정 행 텍스트 파일로서 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