1
votes

Comment supprimer \ r en utilisant IFS?

J'écris un extrait de code comme ci-dessous:

while IFS=$': \r\t' read -r -u9 marker v; do
    case $marker in
        Release)
            export RELEASE=$v
            ;;
    esac
done 9< <(git show -s --format=%b)

Mais je vois que $ v contient toujours \ r . Depuis https://bash.cyberciti.biz/guide/ $ IFS, j'ai lu Une séquence de caractères d'espaces IFS est également traitée comme un délimiteur. Ce que j'ai fait ne devrait-il pas supprimer le \ r de fin des lignes?


4 commentaires

Si vous avez plus de 2 champs dans l'entrée, le deuxième et tous les champs suivants vont dans $ v , y compris les délimiteurs.


Merci. Existe-t-il un moyen propre de réaliser ce que j'essaie de faire ici?


dirigez la commande git vers tr -d '\ r' à l'intérieur de la substitution de processus puis essayez votre IFS sans le \ r


Êtes-vous sûr que cela fonctionne sous bash? Pour une raison quelconque, zsh ne semble pas couper les retours chariot dans cette situation.


3 Réponses :


2
votes

Puisque vous formatez la sortie de git show , utilisez un délimiteur null % x00 dans votre chaîne de format git, cela ne peut jamais être capturé dans une variable shell:

while IFS=$': \t' read -r -u9 marker v
do
  case $marker in
    Release)
      export RELEASE="$v"
      ;;
  esac
done 9< <( git show -s --format='%b%x00' )


1 commentaires

c'est une solution de contournement mais ne répond pas à la question



0
votes

Vous pouvez modifier read de cette façon:

read -r -u9 marker v possibly_something_else;

afin que $ v ne contienne pas \ r


0 commentaires

0
votes

J'ai utilisé tr pour supprimer le \ r de fin. C'était ma solution finale:

while IFS=$': \r\t' read -r -u9 marker v; do
    case $marker in
        Release)
            export RELEASE=$(echo $v | tr -d '\r\t')
            ;;
    esac
done 9< <(git show -s --format=%b)


0 commentaires