说我试图删除换行符或carrige返回。我注意到当我使用音译删除换行符tr -d '\n'
时,我会得到与tr -d $"\n"
或tr -d $'\n'
相同的结果。有什么区别?
我不确定在sed或grep中是如何应用的,因为它们更复杂。所以,我试图首先找出tr,因为这似乎是一个更简单的bash程序。
答案 0 :(得分:5)
tr
自行逃避:
tr -d '\n'
时,tr
程序会识别\
+ n
并替换换行符。tr -d $'\n'
时,Bash会将\n
转换为换行符,并且tr会逐字地看到它。如果您正在尝试了解shell的功能,那么编写一个简短的C程序来逐字打印每个参数可能是值得的 - 例如:
#include <stdio.h>
int main(int argc, char **argv)
{
int i;
/* Ignore argv[0] - the program name is not interesting */
for (i = 1; i < argc; ++i) {
char *p = argv[i];
printf("argv[%d] =", i);
while (*p)
printf(" %3d", (int)*p++);
printf("\n");
}
return 0;
}
这个以十进制打印,但很容易将其更改为使用十六进制或八进制。使用$'\n'
\n
"\n"
作为参数运行它会显示:
argv[1] = 10
argv[2] = 110
argv[3] = 92 110
显示在第一种情况下,Bash传递一个换行符,在第二种情况下,只传递'n',在最后一种情况下,传递'\'和'n'。