Comment utiliser sed pour identifier des motifs sur plusieurs lignes

Je veux donc convertir une liste numérotée d’un formulaire spécifique à un autre.

de cette forme:

1. numberedlist 2. one 3. two 

à cette forme:

 # numberedlist # one # two 

Je fais d’autres modifications sur ce fichier en utilisant sed. Je veux donc utiliser sed pour identifier la première forme chaque fois qu’elle se produit et sans limites, même si la liste numérotée contient plus de 3 éléments.

Mes pensées à propos de cela sont:

en premier : invoquer une ligne contenant le motif (qui est un nombre> un point> un espace …. '[[:digit:]]\. ' ) dans le Pattern Space

second : invoque la ligne suivante dans le pattern Space et vérifie si elle contient '[[:digit:]]\. ' '[[:digit:]]\. ' ou pas. et continuez ainsi jusqu’à ce que la ligne suivante n’arrive pas à la Regex .. puis remplacez-la par #s. mais oui, je ne sais pas si c’est même possible.

C’est ce que j’utilise maintenant:

 s/[[:digit:]]\. /# / 

mais oui je sais que ce n’est pas très efficace. Je suis toujours un peu nouveau dans le monde des sed alors toute aide a été appréciée. Merci.

Edit: désolé pour la confusion les gars, mon but est de changer juste l’index de la liste en #. n’importe quel nombre a commencé de 1. à juste #. Je veux juste convertir les listes numérotées en démarques pour le moteur de numérotation automatique.

Je ne peux pas utiliser quelque chose comme s/[[:digit:]]\. /# / s/[[:digit:]]\. /# / car cela changera toute acuité du motif même si ce n’est pas une liste.

Une solution sed possible:

 sed -r 's/^[[:digit:]]+\. /# /g'  
  • -r : traite le motif de recherche comme une expression rationnelle étendue
  • /^[[:digit]]+\. /# /g /^[[:digit]]+\. /# /g : recherche les lignes qui commencent par 1 ou plusieurs chiffres suivies d’un point et d’un espace et, si elles sont trouvées, remplacent par un # suivi d’un espace
  • laisser toutes les autres lignes telles quelles (c.-à-d. ne pas apporter de modifications)

Par exemple:

 $ cat datfile 1. numberedlist 2. one 3. two where in the world is waldo 10. pickles 15. jam # I'm just a comment sky blue 100. bash 101. ksh 102. csh 72.don't touch this # rubber ducky 

Et un test de notre script sed :

 $ sed -r 's/^[[:digit:]]+\. /# /g' datfile # numberedlist # one # two where in the world is waldo # pickles # jam # I'm just a comment sky blue # bash # ksh # csh 72.don't touch this # rubber ducky 

Utilisez simplement awk :

 $ echo "1. numberedlist 2. one 3. two 55. fifty-five" | awk '{$1="#"} 1' # numberedlist # one # two # fifty-five 

Si vous souhaitez détecter uniquement les lignes commençant par des chiffres:

 $ echo "1. numberedlist 2. one 3. two look ma no digit line 55. fifty-five" | awk '/^[[:digit:]]+\. /{$1="#"} 1' # numberedlist # one # two look ma no digit line # fifty-five 

Mais si vous voulez sed :

 $ echo "1. numberedlist 2. one 3. two look ma no digit line 55. fifty-five" | sed 's/^[[:digit:]][[:digit:]]*\. /# /' # numberedlist # one # two look ma no digit line # fifty-five