pt to remove espaços (codificação múltipla) do fim da linha

2

Eu gosto de remover espaços do começo e do fim da linha.

result="$(mysql -r --column-names=0 -e "SELECT String FROM Table")"
echo $result | cat -E
+stringA +StringB     $
echo $result | sed 's/^\([[:blank:]]\)\+//g' | sed 's/\([[:blank:]]\)\+$//g' | cat -E
+stringA +StringB     $

Copiei a corda com o meu mouse e a inseri com a tecla do mouse 3 (pressione a roda)

echo '+stringA +StringB     ' | sed 's/^\([[:blank:]]\)\+//g' | sed 's/\([[:blank:]]\)\+$//g' | cat -E
+stringA +StringB     $

agora eu pressionei a tecla , navegue até os espaços e substitua por del e espaço

echo '+stringA +StringB     ' | sed 's/^\([[:blank:]]\)\+//g' | sed 's/\([[:blank:]]\)\+$//g' | cat -E
+stringA +StringB$

e agora o comando sed correspondeu e excluiu os espaços . Como posso converter espaços errados espaço sem quebra para espaços normais ?

echo $LANG
en_US.UTF-8
$bash --version
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)
mysql -e "SHOW VARIABLES LIKE '%char%'"
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

Update1:

echo '+stringA +stringB         ' | od -tx1z
0000000 2b 73 74 72 69 6e 67 41 20 2b 73 74 72 69 6e 67  >+stringA +string<
0000020 42 c2 a0 c2 a0 c2 a0 c2 a0 c2 a0 c2 a0 c2 a0 c2  >B...............<
0000040 a0 c2 a0 0a                                      >....<
0000044
echo '+stringA +stringB         ' | od -tx1z
0000000 2b 73 74 72 69 6e 67 41 20 2b 73 74 72 69 6e 67  >+stringA +string<
0000020 42 20 20 20 20 20 20 20 20 20 0a                 >B         .<
0000033
echo '+stringA +stringB         ' | od -c
0000000   +   s   t   r   i   n   g   A       +   s   t   r   i   n   g
0000020   B 302 240 302 240 302 240 302 240 302 240 302 240 302 240 302
0000040 240 302 240  \n
0000044
echo '+stringA +stringB         ' | od -c
0000000   +   s   t   r   i   n   g   A       +   s   t   r   i   n   g
0000020   B                                      \n
0000033

os echo -commandos 1 e 3 são copiados com a tecla do mouse 3 os echo -commandos 2 e 4 estão com espaços normais

Update2:

Eu inseri o comando sed com [^[:graph:]] , mas isso não altera a saída.

for UKWID in 123 456 678; do
    result="$(mysql -r --column-names=0 -e "SELECT String FROM Table WHERE id = $UKWID")"
    echo "$result" | sed 's/^[^[:graph:]]*//;s/[^[:graph:]]*//' | cat -E
done
+stringA +stringB         $
   +stringc +stringx    $
+stringe +stringf      $
    
por FaxMax 13.12.2017 / 13:29

2 respostas

4

Existem espaços em branco (como U + 00A0 no espaço sem quebra) ou caracteres invisíveis (como backspace ou U + 200B) que não são classificados como [:blank:] ou mesmo [:space:] em algumas localidades.

Em teoria, você deve ser capaz de aparar todos os caracteres não gráficos com:

sed 's/^[^[:graph:]]*//;s/[^[:graph:]]*$//'

Mas novamente em algumas localidades em alguns sistemas que não funcionam para U + 00A0.

perl -Mopen=locale -lpe 's/^\P{Graph}+|\P{Graph}+$//'

Funciona para sua U + 00A0, mas não para U + 200B

Você também pode adicionar esses caracteres individualmente por você mesmo. Usando a expansão $'\u....' do tipo zsh (também suportada por versões recentes do bash e algumas outras shells):

trim=$'[[:space:][:cntrl:]\u00a0\u200b]*'
sed "s/^$trim//;s/$trim\$//"
    
por 13.12.2017 / 14:07
-1

Use o comando abaixo para remover espaços vazios no início e no final da linha. Comando Deixe-me saber para qualquer outro requisito adicional

 sed -r "s/^\s+//g"| sed -r "s/\s+$//g"
por 13.12.2017 / 15:41