Eu tenho uma solução decente em
cat example.txt | fold -s | awk 'sub("$", "\r")' | lpr -P PrintAdapter
Estou trabalhando com uma impressora antiga que espera que o CRLF seja um fim de linha. Parte do texto que estou imprimindo não tem fins de linha regulares, e a solução óbvia parece ser fold
(ou mais precisamente, fold -s
). No entanto, quando faço isso, a impressora avança uma linha sem reiniciar o carro para a esquerda - em outras palavras, ela imprime como se tivesse sido enviada LF sem o CR necessário.
Qual é a melhor solução para isso? Devo portar a saída de fold
a tr
antes de imprimir? Meus esforços nesse sentido não tiveram sucesso, ou não tiveram efeito ou produziram uma variedade de diferentes fins de linha truncados. Exemplo com falha:
cat exampleCRLF.txt | fold -s | tr "\n" "\n\r" | lpr -P PrintAdapter
Isso está no OS X, e acho que o shell é BASH, se isso importa.
Eu tenho uma solução decente em
cat example.txt | fold -s | awk 'sub("$", "\r")' | lpr -P PrintAdapter
fold
no Mac OS X 10.11 não converte CR em 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 ..|
$
Como até mesmo após o fold
o 0d
(CR) ainda estar presente na saída; fold
apenas inseriu 0a
(NL) quando necessário.
Se a entrada usar feeds de linha na Internet e a impressora precisar de feeds de linha da Internet, a maneira mais limpa de chamar 0d
agnostic fold
seria converter a entrada em alimentações de linha Unix (excluir qualquer \r
supondo que estão ao lado de \n
), passam essa saída para fold
e, em seguida, convertem a saída de fold
de volta para o uso de feeds de linha da Internet:
tr -d '\r' < exampleCRLF.txt \
| fold -s \
| awk '{printf "%s\r\n", $0}' \
| lpr -P PrintAdapter
Pode ser mais sensato instalar o dos2unix
de um sistema de pacotes (Fink, MacPorts, Homebrew) e usá-lo para conversões de alimentação de linha.
Sua implementação de fold
parece tratar o CR como espaço em branco.
Como a razão pela qual você tem CR é que sua saída exige isso, faça seu processamento sem se preocupar com CR e normalize os caracteres CR no final.
… | sed 's/\r//g; s/$/\r/' | lpr
Este comando sed remove todo o CR e, em seguida, adiciona um CR no final de cada linha. Se sua implementação de sed não suportar \r
, insira um caractere de retorno de carro literal (^ M).
tr
faz traduções de byte para byte, não uma substituição de string, portanto, tr "\n" "\n\r"
não faz sentido. (O caractere espúrio \r
é ignorado.) Use uma ferramenta como sed para executar uma substituição de string.