Fold converte todos os CR e CRLF para LF?

2

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.

    
por Michael Stern 24.06.2017 / 22:21

3 respostas

1

Eu tenho uma solução decente em

cat example.txt | fold -s | awk 'sub("$", "\r")' | lpr -P PrintAdapter
    
por 24.06.2017 / 22:50
1

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.

    
por 25.06.2017 / 16:18
1

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.

    
por 26.06.2017 / 02:37