$'\n'과 같은 bash ANSI C 스타일 이스케이프를 사용하는 경우

$'\n'과 같은 bash ANSI C 스타일 이스케이프를 사용하는 경우

나는 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이 캐리지 리턴 + 줄 바꿈을 보는지 확실하지 않지만 두 경우 모두 원하는 것은 아닙니다.)

관련 정보