我正在使用一台旧打印机,它需要 CRLF 作为行结束符。我正在打印的一些文本没有规则的行尾,明显的解决方案似乎是fold
(或更准确地说,fold -s
)。然而,当我执行此操作时,打印机前进一行而不将笔架重置到左侧 - 换句话说,它打印时就好像已以 LF 方式发送而没有所需的 CR 一样。
对此最好的解决方案是什么?我应该在打印之前移植fold
through的输出吗?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 等工具来执行字符串替换。