Quoting

何時使用 bash ANSI C 樣式轉義,例如 $‘n’

  • April 4, 2015

我不經常使用 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

引用自:https://unix.stackexchange.com/questions/155367