web-dev-qa-db-fra.com

Quel est le problème avec mon expression rationnelle dans GNU sed?

Voici ce que je fais (exemple simplifié):

gsed -i -E 's/^(?!foo)(.*)$/bar\1/' file.txt

J'essaie de mettre bar devant chaque ligne qui ne commence pas par foo. Voici l'erreur:

gsed: -e expression #1, char 22: Invalid preceding regular expression

Qu'est-ce qui ne va pas?

44
yegor256

Pour autant que je sache, sed n'a ni regard en avant ni regard en arrière. Basculez vers un langage plus puissant avec une syntaxe similaire, comme Perl.

54
Birei
sed -i '/^foo/! s/^/bar/' file.txt
  • -i changer le fichier en place
  • /^foo/! n'effectue l'action suivante que sur les lignes non ! commençant par foo^foo
  • s/^/bar/ changer le début de la ligne en bar
116
kkeller

Vous utilisez la syntaxe d'expression régulière compatible Perl (PCRE) qui n'est pas prise en charge par GNU sed. Vous devez réécrire votre expression régulière selon SED Regular-Expressions ou utiliser Perl à la place.

7
hostmaster