2017-12-21 5 views
0

큰 bash 스크립트에서 perl 명령을 사용하여 텍스트 파일의 시간 소인을 현재 날짜 및 시간으로 대체합니다. 출력은,Perl 명령은 명령 행에서 작동하지만 bash 스크립트에서는 작동하지 않습니다.

perlcmd="perl -i -pe 's/2005-03-31T19:13:30/$(date +"%Y-%m-%dT%H:%M:%S")/' ./file.txt" 
echo $perlcmd 
$perlcmd 

에코 명령은 펄 명령이 괜찮 나를 보여줍니다 :

perl -i -pe 's/2005-03-31T19:13:30/2017-12-21T11:33:44/' ./file.txt 

타임 스탬프는, 그러나, 대체되지 나는 다음과 같은 라인을 사용합니다. 에코 선을 명령 줄에 붙여 넣으면 제대로 실행되고 시간 소인이 대체됩니다. 어떻게 작동하도록 bash 스크립트에서 코드를 변경해야합니까?

+0

이 변수 http://mywiki.wooledge.org/BashFAQ/050에 명령을 넣어 (그리고하지 마십시오 [견적이 제대로 (https : //로 stackoverflow.com/questions/10067266/when-to-wrap-quotes-around-a-shell-variable)). – tripleee

답변

0

prelcmd 변수의 작은 따옴표 (날리고 있기 때문에 특정하지 쉘 커맨드 라인 처리로하지만 posix shell 인용 파라미터 확장 전에 임) syntacticaly 그대로되지 해석, 가장 쉬운 배열 대신에 사용하는 이유는

perlcmd=(perl -i -pe 's/2005-03-31T19:13:30/'"$(date +"%Y-%m-%dT%H:%M:%S")"'/' ./file.txt) 
echo "${perlcmd[*]}" 
"${perlcmd[@]}" 
$NewTitle가을 포함한 모든 문자를 포함 할 수있는 경우 :

또 다른 해결책은 코멘트에 따라 eval

perlcmd="perl -i -pe 's/2005-03-31T19:13:30/$(date +"%Y-%m-%dT%H:%M:%S")/' ./file.txt" 
echo "$perlcmd" 
eval "$perlcmd" 

사용 perlcmd 재 해석하는 것입니다 10, perl 코드가 깨지거나 코드가 삽입 될 수 있습니다. ..이 문제 데이터는 데이터가 정규 표현식 패턴에서 사용할 수있는 메타 문자를 포함 할 수있는 경우 또한이 \Q 인용 수, 매개 변수 또는 환경에 의해 전달 될 수 \E을 방지하려면 :

perl -i -pe 'BEGIN{[email protected];[email protected]}s/\Q$old\E/$new/' "$old_title" "$new_title" ./file.txt 
: 매개 변수에 의해

환경에 의해

: 어쨌든 할 경우

old_title=$old_title new_title=$new_title perl -i -pe 's/\Q$ENV{old_title}\E/$ENV{new_title}/' ./file.txt 
+0

좋아요! 변수에 저장된 문자열로 문자열을 대체하려면 어떻게해야합니까? 변수 NewTitle에 원하는 새 문자열이 들어 있다고 가정 해 보겠습니다. perlcmd = (perl -i -pe 's/OldTitle/$ NewTitle /'./file.txt)가 작동하지 않으므로 다른 수정이 필요합니까? – user7417

+0

작은 따옴표로 인해 매개 변수가 확장되지 않기 때문에 작은 따옴표를 닫을 때 열림 두 번 닫고 두 번 열어 단일/OldTitle/' "$ NewTitle"'/ ', 코드 생성은 유지 관리가 까다 롭고 코드 삽입과 관련하여 안전하지 않을 수 있습니다. –

관련 문제