【发布时间】:2017-06-02 00:04:31
【问题描述】:
尝试使用 sed 替换文件内容,替换有效,但由于某种原因,我在生成的输出文件末尾获得了额外的空白,导致文件在打开的应用程序中不可读/不可见。
我的命令如下:
for file in *.example ; do LANG=C sed -i "" "s|https://foo.bar|http://foo.bar|g" "$file" ; done
我尝试过但没有成功的事情:
- 未将 s/[...]/g 参数括在引号中(导致命令失败)
- 使用 | 以外的分隔符例如 / 或 _ 或 %(没有区别)
- 使用单引号而不是双引号(没有区别)
- 同时转义句点和冒号(没有区别)
编辑:这个问题似乎与文件类型有关,因此我不再对解决方案感兴趣。感谢回复的人。
【问题讨论】:
-
如果您需要备份,请将 sed -i "" 替换为 sed -i,使用 sed -i.tmp。
-
@V.Michel:
sed(BSD Sed) 的 macOS (OS X) 实现需要-i "",不像 GNU 实现 (-i.tmp可以同时使用这两者,因为 option-argument是非空的)。有关详细信息,请参阅我的 this answer。 -
如果末尾的空格使文件无法打开,则可能不是纯文本文件;如果它不是纯文本文件,则对其进行纯文本样式替换可能会破坏其格式。文件格式是什么?
-
我看到这种情况发生的唯一方法是当您在
s命令中使用变量并且该变量包含\n或\r。 -
@GordonDavisson 你是对的,它不是纯文本文件;这是一个种子文件。奇怪的是,我之前在 torrent 文件上使用过其他 sed 命令语句并取得了巨大成功,但这些语句来自不同的来源。我相信,无论出于何种原因,这些文件的来源都以与我的 sed 命令语句不匹配的方式对它们进行了编码。事实上,我什至运行了一个旧的 sed 命令语句,我知道它正在工作,但是在这些文件上,它也损坏了它们。