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 }'