Suppression \n si dernier c

Bonjour,

Savez-vous comment supprimer en shell/bash le denier \n d'une variable ?

J'ai essayé avec du
sed -b 's/\n$//'
mais ça n'a pas l'air d'être la bonne piste vu que sed est prévu à la base pour travailler par ligne

D'avance, merci

1 réponse

  • Votes
  • Date
  • Date décroissante
  1. Contributeur
    hello
    $ var="abcd\n\n" ; echo -e ${var%\\n}
    abcd

    $ echo -e "$var"
    abcd

    $
    1. Salut,
      Merci pour ta solution,
      Désolé de répondre un peu tard,

      Je me suis mal expliqué avec mon \n, en fait je cherche à supprimer le dernier "saut de ligne" dans une variable qui est multiligne. Pas de caractères spéciaux à interpréter avec un echo -e mais du texte brut.
      (Et suppression uniquement s'il y a un caractère "saut de ligne" en dernier caractère, sinon on ne fait rien)

      $ var="abcd
      >
      > "
      $ echo "$var"
      abcd

      $ echo "${var%\\n}"
      abcd

      $
    2. Salut,

      Essaie avec
       sed '${/^$/d}'
      :

      Mint ~ $ echo "${var}" | cat -A
      abcd$
      $
      $
      Mint ~ $ echo "${var}" | sed '${/^$/d}' | cat -A
      abcd$
      $
      Mint ~ $


      PS. Le
      cat -A
      n'est là que pour montrer les fins de ligne
    3. Contributeur
      ou
      $ echo "${var}"
      abcd

      $ echo "${var%$'\n'}"
      abcd

      $
    4. Merci pour cette solution efficace :)
      Exactement ce que je cherchais

      Le cat -A est pratique aussi mais il oblige à transformer à l'entrée et rétablir à la sortie, je cherchais quelquechose de plus simple (et avec un $ dans la variable il n'a pas l'air de faire la différence, et il ajoute un saut de ligne comme dernier caractère même quand il n'y en a pas, et le sed ne risque de me supprimer toutes les lignes vides?)
    5. En fait dans
      sed '${/^$/d}'
      , le premier "$" désigne la dernière ligne et ensuite on teste si elle est effectivement vide avec "
      /^$/
      " et on la supprime avec "d" le cas échéant. Les accolades sont là pour signifier que les commandes à l'intérieur ne s'appliquent qu'à la dernière ligne.