이것은 이전 질문 ( 행을 변경하려고 할 때 perl에 인수를 전달하는 방법? )의 고급 버전입니다 .
이번에는 경로를 전달하려고 시도했지만 perl 스크립트가 / 잘못 읽힌 것 같습니다.
file.txt의 4 행이 다음과 같다고 가정합니다.
path_root_abs = "/path/to/thefile"
작업 디렉토리를 얻고 / path / to / file에서 바꾸려면
directory=`pwd`
perl -i -pe "s/(path_root_abs\s=\s\")(.*)(\")/\$1${directory}$3/ if \$. == 4" file.txt
그리고 :
Bareword found where operator expected at -e line 1, near "s/(path_root_abs\s=\s")(.*)(")/$1/scratch"
syntax error at -e line 1, near "s/(path_root_abs\s=\s")(.*)(")/$1/scratch"
Execution of -e aborted due to compilation errors.
유닉스가 스크래치 뒤에 오는 \를 맨 말로 읽지 않으려면 어떻게해야합니까?
첫 번째 문제는 $directory
대체 연산자 ( s///
) 의 구분 기호로도 사용되는 슬래시 가 포함되어 있다는 것 입니다. 경우 기본적 $directory
이며 /home/je_b
, 무엇 펄이 보는 것은 :
perl -i -pe "s/foo//home/jb/ if \$. == 4" file.txt
그것은 소요 /
의를 /home
두 번째로 /
의 s///
운전자. 가장 간단한 해결책은 /
다음 대신 다른 문자를 사용하는 것입니다 .
perl -i -pe "s#foo#${directory}#" file.txt
하지만 다른 방법으로 단순화 할 수도 있습니다. 이걸 고려하세요:
perl -pe "s#(path_root_abs = \")(.*)#\1${directory}\"# if \$. == 4" file
\s
하나의 공간 만 일치해야 할 때 필요하지 않고 공간 만 사용하면됩니다.$1
하고 \1
그래서 후자를 사용하고 탈출 마십시오."
캐릭터 를 캡처 할 필요가 없습니다 . 거기에 있다는 것을 알고 있다면 직접 추가하십시오.마지막으로 pwd
Perl에서 직접 가져올 수도 있습니다. Perl은 %ENV
해시를 통해 내 보낸 모든 쉘 변수에 액세스 할 수 있습니다. 따라서 다음과 같이 할 수 있습니다.
perl -pe 's#(path_root_abs = ").*#$1$ENV{PWD}"# if $.==1' file
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다