Estou usando sed
há algum tempo, mas aqui está uma peculiaridade com a qual me deparo, que não consigo resolver.
Deixe-me explicar meu problema com o caso real.
Cena # 1
printf "ls" | xclip -selection clipboard
echo "ls" | xclip -selection clipboard
No primeiro comando, canalizo a printf
saída para, xclip
para que seja copiada 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 ls
comando copiado não será executado automaticamente.
No segundo, há uma nova linha no final, portanto, 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 colo no terminal, o comando é executado automaticamente.
Eu também tentei remover o caractere de retorno de carro \r
. Mas nada. Parece que estou perdendo algo muito crucial / básico aqui.
generate-text | xclip
caso. Esta resposta remove apenas a última nova linha.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. Portanto, você não poderá remover a nova linha com o sed.
Para remover todas as novas linhas, você pode usar
tr
:fonte
Você pode substituir as novas linhas no sed passando a opção -z .
Página de manual do Sed:
fonte
| xclip
caso.Se você está apenas colocando comandos na área de transferência
Se você precisar fazer transformações mais complexas,
fonte
perl
epython
são muito mais lentos do quesed
quando usados corretamente. Aprender a usá-lo corretamente é a chave.sed
pode fazer muito mais do que pega apenas seus one-liners, e provavelmente pode fazê-lo mais rápido do que qualquer uma dessas outras ferramentas que você menciona.Para remover apenas a última nova linha , passe por:
sed
não adicionará um\0
ao final do fluxo se o delimitador estiver definido comoNUL
via-z
, enquanto que para criar um arquivo de texto POSIX (definido para terminar em a\n
), ele sempre produzirá um final\n
sem-z
.Por exemplo:
E para provar que não foi
NUL
adicionado:Para remover várias linhas novas à direita , passe por:
fonte