sed 不将 \t 解析为制表符

sed 不将 \t 解析为制表符

我正在尝试使用 sed 在咖啡脚本中插入一行,它看起来好像忽略了我的第一个制表符。

我要插入的文件有这样一行:

    karmaServer.start

我想在它后面插入一行,如下所示:

    karmaServer.start
        flags: ['--no-sandbox']

所以我写了一个我认为应该有效的 sed 脚本

sed "/^\t\tkarmaServer.start/a\t\t\t\tflags: ['--no-sandbox']" build/unit-test.coffee 

尽管结果很奇怪。我得到以下内容

    karmaServer.start
t       flags: ['--no-sandbox']

我不明白为什么它以一个t字符开始该行或如何摆脱它。

有任何想法吗?

答案1

您必须在命令中添加换行符sed(然后考虑 shell 对转义换行符的处理):

 sed "/^\t\tkarmaServer.start/a\\
 \t\t\t\tflags: ['--no-sandbox']" build/unit-test.coffee 

正如 GNUsed手册所说:

A \

text 追加文本,其中每个嵌入的换行符前面都有一个反斜杠。

这个不是很清楚,像这样未格式化。 (唉,用命令查看时并不是特别清楚man。)它告诉您的是命令的格式a包括一个反斜杠、一个换行符,然后是一个由文本。换句话说,左边那一栏中的所有内容。

正如问题评论中所指出的,seds 的不同之处在于它们处理格式错误的命令的方式。 Spinellissed会产生一个错误,告诉您除了所需的反斜杠和换行符之外还有其他内容:

% sed "/^\t\tkarmaServer.start/a\t\t\t\tflags: ['--no-sandbox']" /dev/null
sed: 1: "/^\t\tkarmaServer.start ...": 命令末尾 \ 后的额外字符
%

您的特定选择sed似乎只是将行的其余部分视为文本争论。但第一个反斜杠仍然算作后面的强制反斜杠a。因此,你最终得到的结果是文本论据是

t\t\t\tflags: ['--无沙箱']

请注意最初的t, 以及比您预期少的一个选项卡。

相关内容