br sed falha ao remover o caractere de nova linha

6

Eu tenho usado sed há algum tempo, mas aqui está uma peculiaridade que eu não consegui resolver.

Deixe-me explicar meu problema com o caso atual.

Cena 1

printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard

No primeiro comando, cano printf output para xclip para que seja copiado para a área de transferência. Agora, printf , ao contrário de echo , não insere uma nova linha no final por padrão. Portanto, se eu colar esse conteúdo no terminal, o comando ls que é copiado não será executado automaticamente.

No segundo, há uma nova linha no final, então colar o conteúdo da área de transferência também resulta na execução do comando na área de transferência.

Isso é indesejável para mim. Então, eu queria remover a nova linha usando sed , mas ela falhou, conforme explicado na cena abaixo.

Cena 2

echo "ls" | sed -r 's/\n//g' | xclip -selection clipboard

O conteúdo da área de transferência ainda contém nova linha. Quando eu colo no terminal, o comando é executado automaticamente.

Eu também tentei remover o caractere de retorno de carro \r . Mas nada. Parece que estou sentindo falta de algo muito crucial / básico aqui.

    
por shivams 25.01.2015 / 00:52

3 respostas

8

sed delimita em \n ewlines - eles são sempre removidos na entrada e reinseridos na saída. Não há nunca um caractere de% ewline \n em um espaço de padrão sed que não ocorreu como resultado de uma edição feita por você. Nota: com exceção do modo sed do GNU -z ...

Use apenas tr :

echo ls | tr -d \n | xclip -selection clipboard

Ou, melhor ainda, esqueça sed :

printf ls | xclip -selection clipboard
    
por 25.01.2015 / 01:00
5

Muitas ferramentas de processamento de texto, incluindo sed, operam no conteúdo da linha, excluindo o caractere de nova linha. A primeira coisa que o sed faz ao processar uma linha é retirar a nova linha no final, depois executa os comandos no script e adiciona uma nova linha final ao imprimir. Então você não poderá remover a nova linha com sed.

Para remover todas as novas linhas, você pode usar tr :

echo "ls" | tr -d '\n' | xclip
por 25.01.2015 / 01:03
2

Se você está apenas colocando comandos na área de transferência

echo -n "ls " | xclip -selection clipboard

Se você também precisar fazer transformações mais complexas,

echo "ls  " | perl -pe 's/\n//' | xclip -selection clipboard
    
por 25.01.2015 / 01:42

Tags