Remplir un fichier de texte avec un script bash.

Bonjour,

Et il possible avec un script bash de remplir un fichier texte avec un texte prédéfini .
Exemple :
Ligne 1 avec les accents et accents circonflexes
Ligne 2 avec les accents et accents circonflexes
Ligne 3 avec les accents et accents circonflexes
etc...
>> /chemin/monfichier.conf

Au lieu de faire :
echo "Ligne 1 avec les accents et accents circonflexes" > /chemin/monfichier.conf
echo "Ligne 2 avec les accents et accents circonflexes" >> /chemin/monfichier.conf
echo "Ligne 3 avec les accents et accents circonflexes" >> /chemin/monfichier.conf
etc...

Merci

19 réponses

Résumé de la discussion

Il est question de savoir s'il est possible d'alimenter un fichier avec un texte prédéfini en bash, en utilisant redirections simples ou via l'ajout en fin pour construire le contenu. Par exemple, printf 'Ligne %d avec les accents et accents circonflexes' {1..7} pour générer des lignes, ou echo avec redirection pour concaténer des lignes dans un fichier. D'autres échanges évoquent des cas annexes tels que l'utilisation d'autorisations sudo, la gestion de fichiers et le traitement de caractères spéciaux, ou l'insertion d'un bloc de configuration dans un script. En cas de configuration complexe ou de contenu volumineux, la solution la plus efficace reste d'ancrer le contenu dans une variable ou un fichier dédié et d'assembler le tout par des redirections adaptées.

Bobot (l’IA à votre service)
  1. Contributeur
    hello
    $ printf "Ligne %d avec les accents et accents circonflexes\n" {1..7}
    Ligne 1 avec les accents et accents circonflexes
    Ligne 2 avec les accents et accents circonflexes
    Ligne 3 avec les accents et accents circonflexes
    Ligne 4 avec les accents et accents circonflexes
    Ligne 5 avec les accents et accents circonflexes
    Ligne 6 avec les accents et accents circonflexes
    Ligne 7 avec les accents et accents circonflexes
    1
    1. Contributeur
      Salut,

      $ for i in $(seq 10); do echo "Ligne ${i} avec...";done
      Ligne 1 avec...
      Ligne 2 avec...
      Ligne 3 avec...
      Ligne 4 avec...
      Ligne 5 avec...
      Ligne 6 avec...
      Ligne 7 avec...
      Ligne 8 avec...
      Ligne 9 avec...
      Ligne 10 avec...

      0
      1. Bonsoir,

        Heu je suis mal expliqué .

        Chez moi j'ai plusieurs postes.

        Je voudrais savoir comment insérer toute une config avec un copier coller depuis un script bash afin de créer un fichier de configuration une fois le script exécuté.

        Par exemple, toute cette config d'un coup.

         "
        Ceci est un exemple de config
        -----------------------------------
        Fichier de configuration personnalisé
        dlna.conf

        bla bla bla
        bla bla bla

        bla bla bla
        bla bla bla
        bla bla bla
        " > /chemin/fichier.conf

        Et quand j'exécute le script il me crée tout d'un coup le fichier de configuaration.
        Ce qui me permet de faire des copier coller entre les balises
        "" > /chemin/fichier.conf
        et m'évite ainsi de faire :
        echo "Ceci est un exemple de config" > /chemin/monfichier.conf
        echo "-----------------------------------" >> /chemin/monfichier.conf
        echo "" >> /chemin/monfichier.conf
        echo "Fichier de configuration personalisé" >> /chemin/monfichier.conf
        echo "dlna.conf" >> /chemin/monfichier.conf
        echo "" >> /chemin/monfichier.conf
        echo "bla bla bla" >> /chemin/monfichier.conf
        echo "bla bla bla" >> /chemin/monfichier.conf
        echo "" >> /chemin/monfichier.conf
        echo "bla bla bla" >> /chemin/monfichier.conf
        echo "bla bla bla" >> /chemin/monfichier.conf
        echo "bla bla bla" >> /chemin/monfichier.conf

        Esce possible, y a t'il un moyen ?
        Merci.
        0
        1. Bonsoir,

          C'est bon j'ai trouvé.

          echo "
          Ceci est un exemple de config
          -----------------------------------
          Fichier de configuration personnalisé
          dlna.conf

          bla bla bla
          bla bla bla

          bla bla bla
          bla bla bla
          bla bla bla
          " > /chemin/fichier.conf

          Merci.
          0
          1. Contributeur
            ou aussi
            cat <<XXX > /chemin/fichier.conf
            Ceci est un exemple de config
            -----------------------------------
            Fichier de configuration personnalisé
            dlna.conf

            bla bla bla
            bla bla bla

            bla bla bla
            bla bla bla
            bla bla bla
            XXX
            0
            1. Bonsoir,

              Sur un fichier de configuration, j'ai ceci comme message.
               : mauvaise substitution
              idem avec les deux solutions.

              Merci.
              0
              1. Contributeur
                un caractère spécial dans le texte ?
                0
                1. Bonjour,

                  Ou c'est bien ça.
                  Le fichier de configuration fait 829 Lignes impossible de le poster ici, je l'ai mis sur un hébergeur de texte .
                  https://textup.fr/97342hM

                  Quel solution puis-je faire ?

                  Merci.
                  0
                  1. Contributeur
                    Salut,

                    À mon avis c'est le fait que ce soit un fichier M$ qui pose problème ;-((

                    ^M$
                    ^M$

                    ; numeros externes^M$
                    ; quand on compose un numero qui commence par 0,on utilise le lien "freephonie"^M$
                    ;et on passe le numero au peer en otant le premier digit.^M$
                    ^M$
                    exten => _0.,1,Dial(SIP/freephonie_out/${EXTEN}) ^M$
                    0
                2. Contributeur
                  c'est les ${... puisque echo ou cat résolvent les variables
                  essayer
                  cat <<'XXX' > /chemin/fichier.conf
                  ....
                  ...
                  XXX
                  0
                  1. Bonjour,

                    Merci dubcek, c'est nickel.
                    0
                    1. Bonjour,

                      Je viens de faire deux tests et ça marche pas.

                      1er test :
                      sudo cat <<'XXX' > /etc/modprobe.d/blacklist-dvb.conf
                      # Blacklist entries to prevent the DVB side from hooking
                      # an RTL2832 stick for TV usage instead of the desired usage
                      # with rtl_sdr.

                      blacklist dvb_usb_rtl28xxu
                      blacklist rtl2832
                      blacklist rtl2830
                      XXX
                      A la suite du script bash tout est noir.

                      Le terminal affiche :
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 765: avertissement : « here-document » à la ligne 106 délimité par la fin du fichier (au lieu de « XXX »)
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 766: Erreur de syntaxe : fin de fichier prématurée
                      laurent@nathalie-AKOYA-E1318T:~$

                      La ligne 106 est :
                      sudo cat <<'XXX' > /etc/modprobe.d/blacklist-dvb.conf

                      2em test :
                      J'ai également essayé ceci, mais ça marche pas aussi.

                      sudo touch /etc/modprobe.d/blacklist-dvb.conf

                      fichier=/etc/modprobe.d/blacklist-dvb.conf
                      if [ -f $fichier ]
                      then
                      echo "Fichier $fichier créé"
                      else
                      echo "Le fichier $fichier n'existe pas et reste introuvable"
                      echo
                      exit O
                      fi
                      echo

                      sudo echo "# Blacklist entries to prevent the DVB side from hooking" > /etc/modprobe.d/blacklist-dvb.conf
                      sudo echo "# an RTL2832 stick for TV usage instead of the desired usage" >> /etc/modprobe.d/blacklist-dvb.conf
                      sudo echo "# with rtl_sdr. " >> /etc/modprobe.d/blacklist-dvb.conf
                      sudo echo "" >> /etc/modprobe.d/blacklist-dvb.conf
                      sudo echo "blacklist dvb_usb_rtl28xxu" >> /etc/modprobe.d/blacklist-dvb.conf
                      sudo echo "blacklist rtl2832" >> /etc/modprobe.d/blacklist-dvb.conf
                      sudo echo "blacklist rtl2830" >> /etc/modprobe.d/blacklist-dvb.conf

                      le terminal m'affiche :

                      Fichier /etc/modprobe.d/blacklist-dvb.conf créé

                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 98: /etc/modprobe.d/blacklist-dvb.conf: Permission non accordée
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 99: /etc/modprobe.d/blacklist-dvb.conf: Permission non accordée
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 100: /etc/modprobe.d/blacklist-dvb.conf: Permission non accordée
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 101: /etc/modprobe.d/blacklist-dvb.conf: Permission non accordée
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 102: /etc/modprobe.d/blacklist-dvb.conf: Permission non accordée
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 103: /etc/modprobe.d/blacklist-dvb.conf: Permission non accordée
                      /home/laurent/bash/dernier/Installer_sdr.sh: ligne 104: /etc/modprobe.d/blacklist-dvb.conf: Permission non accordée

                      Le fichier n'est pas rempli ?
                      Comment faire alors pour le test 1 et les permissions d'écriture du test 2 ?

                      Merci.
                      0
                      1. Contributeur
                        Salut,

                        sudo bash -c  'echo "# Blacklist entries to prevent the DVB side from hooking" > /etc/modprobe.d/blacklist-dvb.conf'

                        Sans oublier les quotes autour de l'expression.
                        0
                    2. Bonjour,

                      Merci Zip31, ça marche nickel.

                      J'ai un autre problème.Je cherche depuis des heures la solution en vingt.
                      Dans le fichier /etc/udev/rules.d/99_rtlsdr.rules, je doit mettre ceci.

                      # /etc/udev/rules.d/99_rtlsdr.rules

                      SUBSYSTEM=="USB",
                      ATTRS{idVendor)=="Obda",
                      ATTRS{idProduct)=="2838",
                      MODE="0666,GROUP="adm"

                      Mais je n'arrive pas à trouver la solution garder dans le texte les ".

                      Avec ceci ça marche pas
                            sudo bash -c  'echo '# /etc/udev/rules.d/99_rtlsdr.rules' > /etc/udev/rules.d/99_rtlsdr.rules'
                      sudo bash -c 'echo '' >> /etc/udev/rules.d/99_rtlsdr.rules'
                      sudo bash -c 'echo "SUBSYSTEM=="USB"," >> /etc/udev/rules.d/99_rtlsdr.rules'
                      sudo bash -c 'echo "ATTRS{idVendor)=="Obda"," >> /etc/udev/rules.d/99_rtlsdr.rules'
                      sudo bash -c 'echo "ATTRS{idProduct)=="2838"," >> /etc/udev/rules.d/99_rtlsdr.rules'
                      sudo bash -c 'echo "MODE="0666",GROUP="adm"" >> /etc/udev/rules.d/99_rtlsdr.rules'

                      Voilà ce que contient le fichier :
                      laurent@nathalie-AKOYA-E1318T:~$ cat /etc/udev/rules.d/99_rtlsdr.rules
                      # /etc/udev/rules.d/99_rtlsdr.rules

                      SUBSYSTEM==USB,
                      ATTRS{idVendor)==Obda,
                      ATTRS{idProduct)==2838,
                      MODE=0666,GROUP=adm
                      laurent@nathalie-AKOYA-E1318T:~$

                      Comment faut-il faire ?
                      Merci.
                      0
                      1. Contributeur
                        $ sudo bash -c 'cat <<EOF>>/etc/udev/rules.d/99_rtlsdr.rules
                        # /etc/udev/rules.d/99_rtlsdr.rules

                        SUBSYSTEM=="USB",
                        ATTRS{idVendor)=="Obda",
                        ATTRS{idProduct)=="2838",
                        MODE="0666,GROUP="adm"
                        EOF'
                        0
                    3. Re,

                      J'ai eu ce message qui s'affiche :
                      bash: ligne 7: avertissement : « here-document » à la ligne 0 délimité par la fin du fichier (au lieu de « EOF »)
                      Je ne sais pas si c'est normal.

                      Sinon ça marche impeccable.
                      Merci encore une fois Zip31.
                      0
                      1. Contributeur
                        Pour l'avertissement je ne sais que te dire sans voir ton script et la fameuse ligne 7 ;-\
                        0
                      2. La fin d'un fichier me semble-t-il est / doit être Crtl Z
                        0
                    4. Bonsoir,

                      La ligne 7 est vide, c'est ce que je n'ai pas compris, y a rien , c'est un saut de ligne ?

                      Je doit ajouter à la fin du fichier udev
                      /etc/init.d/udev
                      ,SYMLINK+="RTL_SDR"
                      seulement à la fin du fichier, il y a
                      exit 0

                      Extrait de la fin du fichier : /etc/init.d/udev
                          exit 1
                      ;;
                      esac

                      exit 0

                      Je voudrais donc y ajouter a l'avant dernière ligne, entre
                      esac
                      et
                      exit 0
                      .

                      Comment dois-je mis prendre ?

                      ludobabs :
                      Je n'ai pas compris ctrl+z c'est annuler ?

                      Merci.
                      0
                      1. Contributeur
                        Salut,

                        La ligne 7 est vide, c'est ce que je n'ai pas compris, y a rien , c'est un saut de ligne ?
                        D'où mon message précédent et le besoin de voir ton code. Peut-être as-tu omis quelque chose avant ? ;-\

                        Comment dois-je mis prendre ?
                        C'est le seul
                        exit 0
                        du code ?
                        Si oui, avec
                        sed
                        .

                        $ cat plop 
                        exit 1
                        ;;
                        esac

                        exit 0

                        $ sed '/exit 0/i,SYMLINK+="RTL_SDR"' plop
                        exit 1
                        ;;
                        esac

                        ,SYMLINK+="RTL_SDR"
                        exit 0
                        0
                    5. Bonsoir,

                      Après vérification, il y a effectivement plusieurs "exit 0".
                      laurent@nathalie-AKOYA-E1318T:~$ cat -n /etc/init.d/udev | grep "exit 0"
                      92 [ -x /sbin/udevd ] || exit 0
                      132 exit 0
                      240 status_of_proc /sbin/udevd udevd && exit 0 || exit $?
                      249 exit 0
                      laurent@nathalie-AKOYA-E1318T:~$

                      Extrait de la fin du fichier udev avec numérotation.

                      240 status_of_proc /sbin/udevd udevd && exit 0 || exit $?
                      241 ;;
                      242
                      243 *)
                      244 echo "Usage: /etc/init.d/udev {start|stop|restart|reload|force-reload|status}" >&2
                      245 exit 1
                      246 ;;
                      247 esac
                      248
                      249 exit 0
                      250
                      laurent@nathalie-AKOYA-E1318T:~$


                      Merci.
                      0
                      1. Bonsoir,

                        Suite à mon précédent message, comme il y a plusieurs "exit 0" je pense qu'il vaut mieux supprimer les deux dernières lignes est les réécrire, donc j'ai fait comme ceci :

                        echo "Modification du fichier udev"
                        echo
                        sudo sed -i '$d' /etc/init.d/udev
                        sudo sed -i '$d' /etc/init.d/udev
                        sudo bash -c 'echo ',SYMLINK+="rtl_sdr"' >> /etc/init.d/udev'
                        sudo bash -c 'echo "" >> /etc/init.d/udev'
                        sudo bash -c 'echo "exit 0" >> /etc/init.d/udev'
                        sudo bash -c 'echo "" >> /etc/init.d/udev'

                        Je n'ai pas trop bien compris comment faire quand il y a plusieurs mots clé identiques "exit 0" dans le fichier avec votre solution ?

                        Merci Zip31.
                        0
                        1. Bonjour,

                          J'ai un autre problème que je n'arrive pas a résoudre.

                          Quand je tape ceci dans le terminal :
                          laurent@nathalie-AKOYA-E1318T:~$ nom_nouveau_sous_menu="Mes\ applications" ; sudo bash -c  "echo '[Desktop Entry]' > /home/laurent/.local/share/applications/$nom_nouveau_sous_menu"
                          laurent@nathalie-AKOYA-E1318T:~$
                          ça marche.

                          Maintenant dans un fichier bash :
                          #!/bin/bash
                          echo "Mes\ applications"
                          read nom_nouveau_sous_menu
                          sudo bash -c "echo '[Desktop Entry]' > /home/laurent/.local/share/applications/$nom_nouveau_sous_menu"
                          ça marche pas ?

                          Cela me crée le fichier "Mes" au lieu de "Mes applications"
                          laurent@nathalie-AKOYA-E1318T:~$ ls -a /home/laurent/.local/share/applications/M*
                          /home/laurent/.local/share/applications/Mes
                          laurent@nathalie-AKOYA-E1318T:~$

                          Pourquoi ?
                          Pourtant y a les quotes ?

                          Merci.
                          0
                          1. Contributeur
                            Salut,

                            Déjà parce que par convention, par principe et par bon sens (vu les soucis que ça génère), on ne met pas d'espace dans les noms de fichiers/répertoires/ou autres !!! ;-(

                            Pour ton cas, il te suffit de mettre ton nom (qui est demandé via la commande
                            read
                            ) entre quotes (non pas le steak) :

                            read nom
                            'Mon nom de fichier à trous'
                            0
                        2. Re,

                          Je n'ai pas compris ce que vous vouliez dire ?
                          Pour ton cas, il te suffit de mettre ton nom (qui est demandé via la commande
                          read) entre quotes
                          (non pas le steak) :

                          C'est quoi steak ?

                          chez moi depuis le terminal
                          sudo bash -c  "echo '[Desktop Entry]' > /home/laurent/.local/share/applications/$nom_nouveau_sous_menu"

                          fonctionne, mais dans un script bash, non ne fonctionne pas?
                          idem avec :
                          printf "[Desktop Entry]\nName=$nom_nouveau_sous_menu_2\nType=Application\n" > $HOME/.local/share/applications/$nom_nouveau_sous_menu

                          Pourquoi, d'où vient le problème ?

                          Merci.
                          0
                          1. Contributeur
                            Je n'ai pas compris ce que vous vouliez dire ?
                            Pour ton cas, il te suffit de mettre ton nom (qui est demandé via la commande read) entre quotes
                            Le nom du nouveau sous-menu est demandé via la commande read dans ton script, donc il suffit de mettre ce nom entre quotes simples comme dans l'exemple que je tai donné ;-\

                            (non pas le steak) :
                            C'est quoi steak ?
                            Entre quote => entrecôte ;-))
                            0
                        3. Re,

                          J'ai trouvé :
                          printf "[Desktop Entry]\nName=$nom_nouveau_sous_menu_2\nType=Application\n" > "$HOME/.local/share/applications/$nom_nouveau_sous_menu"
                          ça fonctionne avec les fichiers longs

                          PS : Sous Kde, si je veux créer un sous-menu "Mes applications" dans le menu, je dois créer un fichier long.

                          Merci.
                          0

                          Discussions similaires

                          question pix mot caché

                          7 réponses