bash - 在什么情况下我应该在音译中使用美元符号和单引号(例如 tr -d '\n' )或任何其他函数?

标签 bash tr

假设我正在尝试删除换行符或回车符。我注意到当我使用音译删除换行符 tr -d '\n' 时,我得到的结果与 tr -d $"\n" 相同。或tr -d $'\n' 。有什么区别?

我不确定这在 sed 或 grep 中如何应用,因为它们更复杂。因此,我首先尝试找出 tr,因为这似乎是一个更简单的 bash 程序。

最佳答案

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”。

关于bash - 在什么情况下我应该在音译中使用美元符号和单引号(例如 tr -d '\n' )或任何其他函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610308/

相关文章:

linux - 使用 find 将参数传递给并行程序

linux - tr -s 无法压缩连续空格

r - 识别R中2个数据帧的唯一值

字符串比较中的 Bash glob

linux - Bash 数组创建 : ("$@") vs ($@)

bash - 如何 cd 进入名称中有空格的目录?

bash - 在终端中格式化输出,删除空行并转换逗号

linux - shell 脚本 : Using grep and tr in the shebang

shell - 从 shell 中的两行中选择不同的值

linux - 召唤其他脚本的菜单