Como remover os dois tipos de linha usando apenas o bash

0

A variável v tem \ n e, hm, outro tipo newline ??

v='ab\n cd
 ef
'
printf '%b' "$v"
ab
 cd
 ef
printf '%s' "$v"
ab\n cd
 ef
printf '%s' "$v" | xxd
00000000: 6162 5c6e 2063 640a 2065 660a            ab\n cd. ef.
printf '%b' "$v" | xxd
00000000: 6162 0a20 6364 0a20 6566 0a              ab. cd. ef.

printf '% b' mostra as novas linhas como o caractere ASCII 10.

Minha função remove os dois tipos de linha, mas usa processos diferentes para cada tipo.

remove() {
  local str="$1" chr='\n\t\r' idx
  for (( idx=0; idx<${#chr}; idx+=$((${#chr} / 3)) )); do   
    str="${str//${chr:${idx}:3}}"
  done
  str=${str//[$'\n\t\r']}
  printf "${str}"
}

Existe uma maneira melhor de lidar com um único processo usando apenas Bash?

Estou usando o GNU bash 4.4.19.

    
por Buoy 10.03.2018 / 18:52

2 respostas

2

Não há realmente dois tipos de novas linhas; \n é apenas uma sequência de caracteres até que você a passe para printf '%b' ou algum outro comando, como echo -e , que a interpreta como uma sequência de escape de barra invertida.

Portanto, você pode usar printf '%b' para converter qualquer \n de sequências para novas linhas, depois remover todas as novas linhas usando a substituição de parâmetros e uma bash Cadeia de caracteres :

v='ab\n cd                     
 ef
'
printf -v w '%b' "$v"; printf '%s\n' "${w//$'\n'}"
ab cd ef
    
por 10.03.2018 / 19:10
0

Você pode simplesmente usar o eco. Whithout -e e ", echo ver \ n como string e você pode removê-lo usando a substituição de parâmetro.

echo ${v//\n}
    
por 11.03.2018 / 21:29