Remover parcialmente a formatação do texto na área de transferência

1

Preciso excluir a formatação do texto contido na área de transferência, mas mantendo alguns elementos. Os mais importantes são os caracteres "nova linha". Em um script simples, o efeito de

variable=$(xsel --clipboard)

é que o texto parece estar na mesma linha, perdendo todos os caracteres de "nova linha".

1) Existe uma maneira de evitar isso? Às vezes eu copio texto do formato Windows (então a nova linha é "\ r \ n") e às vezes de * nix (e então a nova linha é apenas "\ n").

2) A pergunta anterior foi a mais importante, mas: há também uma maneira de preservar os elementos de formatação "negrito", "itálico" e "sublinhado"? Porque todos eles também estão perdidos com o comando shell.

Obrigado mesmo assim!

    
por BowPark 21.03.2014 / 12:46

1 resposta

2

Sim. a substituição de comandos remove todas as novas linhas 1 .

Para contornar:

var=$(xsel --clipboard; echo .)
var=${var%?}

Isso é adicionar .\n a essa saída. E remova o ponto depois com ${var%?} (o \n é cuidado pela substituição do comando).

Observe que, exceto com zsh , as variáveis de shell não podem conter bytes NUL.

Se você deseja preservar o status de saída:

var=$(xsel --clipboard; ret=$?; echo .; exit "$ret")
ret=$?
var=${var%?}

Lembre-se de citar $var ao expandi-lo:

printf %s "$var"

Uma função auxiliar:

cmdsubst() {
  _var=$1; shift
  eval "$_var="'$("$@"; ret=$?; echo .; exit "$ret")
    _ret=$?
    '"$_var=\${$_var%?}"
  return "$_ret"
}

Para ser usado como:

cmdsubst var xsel --clipboard

Para preservar o "negrito" ... Algumas ferramentas exportam a seleção CLIPBOARD como text / html além de apenas uma string UTF8. Nesse caso (com versões recentes de xclip ), você pode fazer:

cmdsubst html xclip -sel c -o -t text/html

Veja a saída de xclip -sel c -o -t TARGETS para ver quais destinos de seleção o proprietário atual da seleção CLIPBOARD fornece.

Exemplo após copiar uma parte do meu comentário para Mikel acima no iceweasel:

$ xclip -sel c -o -t TARGETS
TIMESTAMP
TARGETS
MULTIPLE
SAVE_TARGETS
text/html
text/_moz_htmlcontext
text/_moz_htmlinfo
UTF8_STRING
COMPOUND_TEXT
TEXT
STRING
text/x-moz-url-priv
$ xclip -sel c -o -t text/html
<span class="comment-copy"><i>should</i> remove <i>only one</i> trailing newline</span>
$ xclip -sel c -o -t TEXT
should remove only one trailing newline

1 Uma exceção a isso são os shells da família rc onde você pode dizer que não quer nenhum pós-processamento com a sintaxe var = ''(){xsel --clipboard} .

    
por 21.03.2014 / 14:23