Fold 将所有 CR 和 CRLF 转换为 LF?

Fold 将所有 CR 和 CRLF 转换为 LF?

我正在使用一台旧打印机,它需要 CRLF 作为行结束符。我正在打印的一些文本没有规则的行尾,明显的解决方案似乎是fold(或更准确地说,fold -s)。然而,当我执行此操作时,打印机前进一行而不将笔架重置到左侧 - 换句话说,它打印时就好像已以 LF 方式发送而没有所需的 CR 一样。

对此最好的解决方案是什么?我应该在打印之前移植foldthrough的输出吗?tr我在这些方面的努力并不成功,要么没有效果,要么产生各种不同的乱码行尾。失败的例子:

cat exampleCRLF.txt | fold -s | tr "\n" "\n\r" | lpr -P PrintAdapter

这是在 OS X 下,我认为 shell 是 BASH,如果这很重要的话。

答案1

我有一个不错的解决方案

cat example.txt | fold -s | awk 'sub("$", "\r")' | lpr -P PrintAdapter

答案2

fold在 Mac OS X 10.11 上不会将 CR 转换为 LF:

$ perl -E 'say(("aaaa "x17)."\r") for 1..2' | hexdump -C | grep 0d          
00000050  61 61 61 61 20 0d 0a 61  61 61 61 20 61 61 61 61  |aaaa ..aaaa aaaa|
000000a0  61 20 61 61 61 61 20 61  61 61 61 20 0d 0a        |a aaaa aaaa ..|
$ perl -E 'say(("aaaa "x17)."\r") for 1..2' | fold -s | hexdump -C | grep 0d
00000050  0a 61 61 61 61 20 0d 0a  61 61 61 61 20 61 61 61  |.aaaa ..aaaa aaa|
000000a0  61 61 20 61 61 61 61 20  0a 61 61 61 61 20 0d 0a  |aa aaaa .aaaa ..|
$ 

即使在(CR)之后,fold输出0d中仍然存在;fold仅在必要时插入0a(NL)。

如果输入确实使用 Internet 换行符,并且打印机确实需要 Internet 换行符,则调用0d不可知论者的最简洁方法fold是将输入转换为 Unix 换行符(\r假设这些换行符位于 旁边,则删除任何\n换行符),将该输出传递给fold,然后将 back的输出转换fold为使用 Internet 换行:

tr -d '\r' < exampleCRLF.txt \
| fold -s \
| awk '{printf "%s\r\n", $0}' \
| lpr -P PrintAdapter

dos2unix从软件包系统(Fink、MacPorts、Homebrew)安装并使用它进行换行转换可能更明智。

答案3

您的实现fold似乎将 CR 视为空格。

由于您拥有 CR 的原因是您的输出需要它,因此在进行处理时不必担心 CR,并在最后规范化 CR 字符。

… | sed 's/\r//g; s/$/\r/' | lpr

此 sed 命令删除所有 CR,然后在每行末尾添加一个 CR。如果您的 sed 实现不支持\r,请插入文字回车 (^M) 字符。


tr进行字节对字节的翻译,而不是字符串替换,所以tr "\n" "\n\r"没有意义。 (虚假字符\r将被忽略。)使用 sed 等工具来执行字符串替换。

相关内容