Comment editer la ligne suivante après un pattern utilisant sed?

En utilisant sed , comment puis-je searchr une ligne se terminant par foo , puis éditer la ligne suivante si elle commence par #bar ?

Ou en d'autres termes, je veux supprimer un commentaire # de la ligne suivante s'il commence par #bar et que la ligne précédente se termine par foo .

Par exemple:

 This is a line ending in foo #bar is commented out There are many lines ending in foo #bar commented out again 

J'ai essayé:

 sed -i 's/^foo\n#bar/foo\nbar/' infile 

Utilisez le cycle N;P;D et essayez de le replace à chaque fois:

 sed '$!N;s/\(foo\n\)#\(bar\)/\1\2/;P;D' infile 

cela supprime le # principal de #bar seulement s'il suit une ligne se terminant par foo sinon il imprime juste l'espace de motif non modifié.


Apparemment , vous voulez décommenter les miroirs américains dans /etc/pacman.d/mirrorlist qui est une chose complètement différente:

 sed '/United States/,/^$/{//!s/^#//}' /etc/pacman.d/mirrorlist 

Cela décommentera tous les miroirs de la section États-Unis dans /etc/pacman.d/mirrorlist

Essayer:

 sed -e '$!N;/foo\n#bar/s/\(\n\)#/\1/;P;D' 
 sed '/foo$/{n;s/^#bar/bar/;}' 

est une traduction littérale de votre exigence. n est pour le next .

Maintenant cela ne fonctionne pas dans des cas comme:

 line1 foo #bar line2 foo #bar 

Ou:

 line1 foo line2 foo #bar 

Ce que vous pourriez répondre en faisant:

 sed ' :1 /foo$/ { n s/^#bar/bar/ b1 }'