1
votes

alternative perl pour sed pour diviser plusieurs |

J'ai pu accomplir cela dans la commande sed, mais je n'ai pas pu le faire fonctionner en perl. Souhaite ajouter des espaces entre les caractères pipe qui sont proches les uns des autres sans espaces ni caractères alphanumériques.

| a | | | 1 | 2 | 3 | | | # | # | | | | | | | | | 

Cette commande sed fonctionne correctement:

echo "a|123|##||||" | perl -pe 's/\([^[:blank:][:alnum:]]\)|/\1 | /g'

sortie pour la commande ci-dessus ==> a | 123 | ## | | | |

En perl, je n'ai pas pu le faire fonctionner

echo "a|123|##||||" | sed 's/\([^[:blank:][:alnum:]]\)|/\1 | /g'

avec la sortie de la commande ci-dessus

input           ==>  a|123|##||||
expected output ==>  a|123|##| | | |


0 commentaires

3 Réponses :


0
votes

La syntaxe Perl correcte serait:

echo "a|123|##||||" | perl -pe 's/([^\s\w])\|/$1 | /g'
  • Le caractère de tuyau doit être échappé
  • 1 $ est utilisé pour le premier match de groupe


0 commentaires

6
votes

Pour ajouter de l'espace uniquement entre ceux | qui se côtoient

echo "a|123|##||||" | perl -pe's/\|(?=\|)/\| /g'

J'utilise un lookahead afin de pouvoir détecter les consécutifs (et les chevauchements! ) paires, avec plus de deux | enchaînés ensemble: Seul le premier d'un match est consommé donc le second y reste pour le prochain match, au cas où il y en aurait un autre après (encore une fois affirmé avec l'anticipation).


0 commentaires

2
votes

Une autre façon d'utiliser à la fois lookahead et lookbehind.

$ echo "a|123|##||||" | perl -pe's/(?<=\|)(?=\|)/ /g '
a|123|##| | | |

$


0 commentaires