$ '\ 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がキャリッジリターン+改行を見ているかどうかはわかりませんが、どちらの場合も望むものではありません。)

関連情報