나는 bash를 자주 사용하지 않지만 과거에는 명령줄에서 탭이나 줄 바꿈을 전달할 때 $
문자열을 작은따옴표로 묶기 전에 특수 문자를 사용하여 문자를 이스케이프 처리해야 했던 것을 기억합니다. 좋아요 $'\t'
, $'\n'
잠깐만요, 읽었습니다bash 매뉴얼의 인용문과 이스케이프.
ANSI C 스타일 이스케이프를 사용하는 것이 적절한 시기가 언제인지 궁금합니다. 예를 들어, 저는 grep에서 정규식을 사용하고 있는데 줄 바꿈을 위해 ANSI C 스타일 이스케이프가 필요한 것 같습니다. 그런 다음 Perl로 전환했지만 그렇지 않은 것 같습니다.
예를 들어stackoverflow에 대한 최근 질문작동하지 않는 Perl 정규 표현식에 대해. 이것은 내가 사용하는 정규식입니다.
echo -e -n "ab\r\ncd" | perl -w -e $'binmode STDIN;undef $/;$_ = <>;if(/ab\r\ncd/){print "test"}'
를 사용하여 문자열에 ANSI C 스타일 이스케이프를 제공했기 때문에 이것이 실제로 잘못된 것으로 나타났습니다 $
. 언제 달러 기호를 앞에 붙여야 하는지, 언제 붙여서는 안되는지 이해가 되지 않습니다.
답변1
$'...'
쉘이 이스케이프 시퀀스를 해석하도록 하려는 경우에 사용하십시오.
$ echo 'a\nb'
a\nb
$ echo $'a\nb'
a
b
에서 옵션 perl
은 -e
문자열을 얻습니다. 사용되는 경우 $'...'
문자열의 이스케이프 시퀀스는 에 전달되기 전에 해석됩니다 perl
. 당신이 생각하는 한 이 \r
사라졌으며 에 전달되지 않았습니다 perl
.
그리고 $'...'
:
$ perl -MO=Deparse -we $'binmode STDIN;undef $/;$_ = <>;if(/ab\r\ncd/){print "test"}'
BEGIN { $^W = 1; }
binmode STDIN;
undef $/;
$_ = <ARGV>;
if (/ab\ncd/) {
print 'test';
}
-e syntax OK
그것 없이:
$ perl -MO=Deparse -we 'binmode STDIN;undef $/;$_ = <>;if(/ab\r\ncd/){print "test"}'
BEGIN { $^W = 1; }
binmode STDIN;
undef $/;
$_ = <ARGV>;
if (/ab\r\ncd/) {
print 'test';
}
-e syntax OK
답변2
$'\n'
기본적으로 를 입력하는 것과 같습니다 Enter.
따라서 Perl 예에서는 *가 됩니다.
if(/ab
cd/)
당신이 원하는 것이 아닌가요?
내가 생각하는 이유는 다음과 같습니다 $'...'
.
- 다음과 같이 작은따옴표로 구분된 문자열 안에 작은따옴표를 넣고 싶습니다.
logger $'Can\'t open file'
- 인쇄할 수 없는 문자를 더 명확하게 만듭니다
$'a\tb'
.'a<TAB character>b'
(이것이 \r\n
동등한 것으로 간주되는지 \n
또는 Perl이 캐리지 리턴 + 줄 바꿈을 보는지 확실하지 않지만 두 경우 모두 원하는 것은 아닙니다.)