Forum Linux.débutant [SED] Ajouter un caractère en début de ligne.

Posté par . Licence CC by-sa
Tags : aucun
0
27
mai
2018

Salut les forumeurs,
Voilà, donc, j'ai un fichier (test.conf) qui contient des noms de domaines :

local-zone: "google.com" redirect
local-data: "google.com A 0.0.0.0"

et un j'ai script bash qui sera exécuté par l'utilisateur :

read -p "- The domain : " domain
look=$(cat test.conf | grep "$domain")
sed 's/'$look'/^#/' test.conf

Donc, l'objectif du script, c'est qu'il demande un domaine (ex: google.com) à l'utilisateur, et le script ajoute un caractère (#) en début de ligne dans le fichier (test.conf).

Ca fait un petit moment que j'essaye de me battre contre la syntaxe de sed, mais sans résultat, donc, je m'en remet à l'intelligence collective.

Merci d'avance.

  • # référence arrière

    Posté par . Évalué à -1 (+0/-3).

    Avec la commande de substitution (s), quand tu fais la sélection d'un motif par sed, tout le motif est remplacé par l'instruction que tu donnes en seconde partie (ici #). Si tu veux conserver tout ou partie du motif de départ, il faut l'indiquer à sed.

    relis de plus près la doc sur le remplacement, et notamment les références arrière.

    • [^] # Re: référence arrière

      Posté par . Évalué à 2 (+1/-0).

      J'ai bien pris en compte ton commentaire, et j'obtiens ce résultat :

      sed -i "s/$look/#$look/" test.conf

      Sauf, que j'obtiens cette erreur :
      bash
      sed: -e expression #1, char 35: unterminated `s' command

  • # Exemple

    Posté par (page perso) . Évalué à 3 (+2/-1).

    Quelque chose comme :

    sed 's/^\(.*'$look'.*\)$/#\1/'

    ^ = depuis le début de la ligne
    .* = tous les caractères
    $look = jusqu'au nom de domaine
    .* = tous les caractères
    $ = jusqu'à la fin de la ligne
    \(…\) = mémoriser cette suite de caractères dans le premier tampon mémoire disponible (donc le numéro 1 dans ce cas)
    \1 = écrire le contenu du tampon mémoire numéro 1

    Attention, si la personne tape une ligne vide, ou « redirect » ou d'autres choses, ça ne va pas donner le résultat voulu.

    • [^] # Re: Exemple

      Posté par . Évalué à 2 (+1/-0).

      Merci de prendre le temps de m'aider :) La commande fonctionne quand j'ai des noms de domaines comme : "domaine.com" dans le fichier test.conf, mais elle ne marche pas si j'ai des noms de domaine comme : "www.domaine.com", et j'obtiens cette erreur :

      sed: -e expression #1, char 16: unterminated `s' command

      Merci, tu m'as déjà donné beaucoup d'info, je vais continuer de chercher, bonne soirée.

  • # Il faut protéger la variable, et corriger la commande sed

    Posté par . Évalué à 7 (+5/-0). Dernière modification le 27/05/18 à 22:30.

    D'abord, si la variable $look contient des caractères particulier (ne serait-ce qu'un espace!), ça ne va pas donner ce que tu espèce.
    Il faut la protéger avec des guillemets doubles:

    sed 's/'"$look"'/^#/' test.conf

    Mais puisque le reste de la commande sed ne contient pas de $, on peut faire plus simple:

    sed "s/$look/^#/" test.conf

    Ensuite, cette commande sed ne fait pas ce que tu crois, elle va remplacer la valeur contenue dans $look par la série de caractères "#".

    Mais en fait, toute la ligne qui affecte une valeur à look ne sert à rien (et contient un UUOC).
    Tu peux simplement faire

    sed "/$domain/ s/^/#/" test.conf

    Cette version utilise une adresse, sous forme d'expression rationnelle, pour déterminer à quelles lignes appliquer la commande s, cette dernière se contente de faire un match sur le début de la ligne, et le remplacer par un #.
    Et au moins, cette version fonctionnera correctement si plus d'une ligne dans le fichier contient de domaine recharché.

    Note que si $domain contient des caractères spéciaux pour sed, ça ne fonctionnera pas.
    Au minimum, puisqu'il doit s'agir de noms de domaine, il faudrait échapper les points, tu peux utiliser la syntaxe du shell pour ça avec l'expansion du type ${PARAMETER/PATTERN/STRING}, ça donne

    sed "/${domain//./\\.}/ s/^/#/" test.conf

    Je n'ai pas testé, mais cette version à plus de chance de fonctionner.

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.