$ '\ 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

おすすめ記事