FoldはすべてのCRとCRLFをLFに変換しますか?

FoldはすべてのCRとCRLFをLFに変換しますか?

行終端としてCRLFを必要とする古いプリンタを使用しています。私が印刷している一部のテキストには一般的な行末がありません。確かな解決策はfold(またはより正確にはfold -s)そうです。ただし、これにより、プリンタはキャリッジを左にリセットせずに1行前に移動します。つまり、必要なCRなしでLFに送信されたかのように印刷します。

これに対する最善の解決策は何ですか?印刷する前にスルーの出力を移植する必要がありますかfoldtrこれに対する私の努力は成功せず、何の効果もなかったか、いくつかの間違った行末を作り出しました。失敗例:

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

foldMac 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

あなたの実装では、foldCRを空白として扱うようです。

CRがある理由は出力に必要なため、処理を実行するときにCRを心配しないで、最後にCR文字を正規化してください。

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

この sed コマンドはすべての CR を削除し、各行の末尾に CR を追加します。 sed実装がそれをサポートしていない場合は、\rリテラルキャリッジリターン(^ M)文字を挿入してください。


tr文字列置換ではなくバイト間変換を行うのでtr "\n" "\n\r"意味がありません。 (偽の文字は\r無視されます。) 文字列置換を実行するには、sed などのツールを使用します。

関連情報