Il existe de nombreuses variantes de la syntaxe des expressions régulières . Les tout premiers outils dans le monde Unix qui avaient des expressions régulières n'avaient pas toutes les capacités des expressions régulières, seulement des jeux de caractères ( […]
et .
), des répétitions ( *
) et des ancres de ligne ( ^
et $
). Les expressions régulières de base n'ont que ces opérateurs. Sed est un outil à l'ancienne et utilise des expressions rationnelles de base.
De nombreuses implémentations sed ont des extensions pour une correspondance regexp complète. Parce que le personnage |
se représente lui-même, vous devez utiliser \|
pour l'alternance, et de même \(
et \)
pour le regroupement. Notez que la norme POSIX ne requiert pas la \|
prise en charge dans les expressions régulières de base , et certains systèmes (par exemple OpenBSD ) ne l'ont pas.
Certaines versions de sed ont la possibilité de passer aux expressions régulières étendues , où elles (…)
sont utilisées pour le regroupement et l' |
alternance. Avec GNU sed (c'est-à-dire sous Linux ou Cygwin) ou Busybox , passez l' -r
option. Sur FreeBSD ou OSX , passez l' -E
option.
Si votre sed n'a pas d'alternance, vous pouvez appeler à la awk
place. Il est mandaté par POSIX , mais un peu détaillé pour cette tâche, et il ne prend pas en charge les références arrières.
awk '{gsub(/foo|bar/, "narf")}' <fileName.old >fileName.new
Soit dit en passant, seuls GNU et Busybox sed prennent en charge le remplacement de fichiers en place. Awk et les autres versions de sed ne le font pas. Voir Puis-je faire `couper 'changer un fichier en place?
Si vous avez Perl, il est souvent pratique d'une manière un-outil-tout-pour le traitement de texte one-liners. La plupart de ce qui est facile dans sed, awk et le reste n'est pas beaucoup plus difficile dans Perl, et vous pouvez vous en tirer en apprenant un seul outil (si complexe).
perl -i -pe 's/foo|bar/narf/g' fileName
Gilles 'SO- arrête d'être méchant'
la source