안녕하세요.
예를 간단히 들면요, cal.txt란 파일 내용 중, JAN을 January로 바꾸기 위해, 그냥 csh에서 하던 습관대로 아래처럼 하면, Jan이 January로 바뀌지 않고, 의도하지 않게 ${name} 전체로 치환이 되버리는군요.
해결 방법이 있는지요.
set name = "Januaryary" perl -pi -e 's/JAN/${name}/g' cal.txt
감사합니다.
perl -pi -e "s/JAN/${name}/g" cal.txt
이러면 되네요
근데, 작은 땀표, 큰 땀표 차이가 모지요?
'는 내부의 쉘변수를 보간(interpolation)하지 않고 "는 내부의 쉘변수를 보간합니다.
echo 's/JAN/${name}/g'
echo "s/JAN/${name}/g"
UNIX에서 Perl oneliner를 사용할 때는 다음과 같이 ' '를 씁니다.
perl -e 'print 1'
" "을 쓰면 UNIX shell이 " "내부의 코드들의 Perl변수 부분을 쉘 변수로 보간해 버리기 때문이죠
perl -e "my $a=1; print $a" syntax error at -e line 1, near "my ="
위에서 $a라는 쉘 변수가 없기 때문에 실제로 Perl에는 'my =1; print' 라는 스트링이 넘어가서 에러가 발생합니다. " "를 써서라도 동작하게 하려면 Perl 스칼라 변수의 sigil인 $를 \로 이스케이핑해주면 됩니다.
perl -e "my \$a=1; print \$a" 1
하지만 ' '을 쓰면 이러한 문제가 없죠.
perl -e 'my $a=1; print $a' 1
따라서 UNIX의 Perl onliner에서 " "을 쓰는건 어떤 경우에 만족하는 결과가 나왔다고 해도 추천하지 않습니다.
저 같으면 쉘 변수를 정의하고 Perl oneliner 내부에서 불러쓴다면
perl -pi -e 's/JAN/$ENV{name}/g' cal.txt
처럼 하겠습니다. Perl에서 $ENV{환경변수이름}은 해당 이름을 가지는 쉘 환경변수를 뜻하고 Perl에서 정규표현식내부는 변수를 보간(interpolation)하므로 원하는 결과가 얻어집니다.
1
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
큰따옴표로
perl -pi -e "s/JAN/${name}/g" cal.txt
이러면 되네요
오잉..감사 ㅠㅠ
근데,
작은 땀표, 큰 땀표 차이가 모지요?
'와 "의 차이는 보간하느냐 하지 않느냐 차이입니다.
'는 내부의 쉘변수를 보간(interpolation)하지 않고
"는 내부의 쉘변수를 보간합니다.
echo 's/JAN/${name}/g'
echo "s/JAN/${name}/g"
UNIX에서 Perl oneliner를 사용할 때는 다음과 같이 ' '를 씁니다.
perl -e 'print 1'
" "을 쓰면 UNIX shell이 " "내부의 코드들의 Perl변수 부분을 쉘 변수로 보간해 버리기 때문이죠
perl -e "my $a=1; print $a"
syntax error at -e line 1, near "my ="
위에서 $a라는 쉘 변수가 없기 때문에 실제로 Perl에는 'my =1; print' 라는 스트링이 넘어가서 에러가 발생합니다.
" "를 써서라도 동작하게 하려면 Perl 스칼라 변수의 sigil인 $를 \로 이스케이핑해주면 됩니다.
perl -e "my \$a=1; print \$a"
1
하지만 ' '을 쓰면 이러한 문제가 없죠.
perl -e 'my $a=1; print $a'
1
따라서 UNIX의 Perl onliner에서 " "을 쓰는건 어떤 경우에 만족하는 결과가 나왔다고 해도 추천하지 않습니다.
저 같으면 쉘 변수를 정의하고 Perl oneliner 내부에서 불러쓴다면
perl -pi -e 's/JAN/$ENV{name}/g' cal.txt
처럼 하겠습니다. Perl에서 $ENV{환경변수이름}은 해당 이름을 가지는 쉘 환경변수를 뜻하고
Perl에서 정규표현식내부는 변수를 보간(interpolation)하므로 원하는 결과가 얻어집니다.
1
1
댓글 달기