行終端としてCRLFを必要とする古いプリンタを使用しています。私が印刷している一部のテキストには一般的な行末がありません。確かな解決策はfold
(またはより正確にはfold -s
)そうです。ただし、これにより、プリンタはキャリッジを左にリセットせずに1行前に移動します。つまり、必要なCRなしでLFに送信されたかのように印刷します。
これに対する最善の解決策は何ですか?印刷する前にスルーの出力を移植する必要がありますかfold
?tr
これに対する私の努力は成功せず、何の効果もなかったか、いくつかの間違った行末を作り出しました。失敗例:
cat exampleCRLF.txt | fold -s | tr "\n" "\n\r" | lpr -P PrintAdapter
これはOS Xに属し、重要な場合、シェルは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
。 (NL)はfold
必要な場合にのみ挿入されます。0a
入力がインターネット改行文字を使用し、プリンタにインターネット改行文字が必要な場合、これを不可知論と呼ぶ0d
最もきれいな方法fold
は、入力をUnix改行文字に変換することです(\r
改行文字が横にあると仮定してすべての改行文字を削除\n
)。出力は次のとおりです。渡されたfold
後、バックの出力はfold
インターネット改行を使用するように変換されます。
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 などのツールを使用します。