Quoting
何時使用 bash ANSI C 樣式轉義,例如 $‘n’
我不經常使用 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"}'
事實證明這實際上是不正確的,因為我使用
$
. 我只是不明白什麼時候應該加上美元符號,什麼時候不應該。
$'...'
當您希望 shell 解釋轉義序列時使用。$ 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