![sed 不将 \t 解析为制表符](https://linux22.com/image/148964/sed%20%E4%B8%8D%E5%B0%86%20%5Ct%20%E8%A7%A3%E6%9E%90%E4%B8%BA%E5%88%B6%E8%A1%A8%E7%AC%A6.png)
我正在尝试使用 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
包括一个反斜杠、一个换行符,然后是一个由文本。换句话说,左边那一栏中的所有内容。
正如问题评论中所指出的,sed
s 的不同之处在于它们处理格式错误的命令的方式。 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
, 以及比您预期少的一个选项卡。