Comment puis-je remplacer du texte après un mot spécifique en utilisant sed?

12

J'ai un fichier nommé .ignore. Besoin de remplacer le projdir. Par exemple:

ignore \..*
ignore README
projdir Snake

Je dois remplacer Snake par, par exemple, "PacMan". J'ai lu la page de manuel, mais je ne sais pas quoi faire.

Jakub Baski Gabčo
la source

Réponses:

18

Recherchez une ligne commençant par projdiret remplacez la ligne entière par une nouvelle:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^et $sont des marqueurs de début / fin de ligne, donc le motif correspondra à toute la ligne; .*correspond à tout. Le -idit sedd'écrire les changements directement dans .ignore, au lieu de simplement les sortir

Michael Mrozek
la source
5

Une approche consiste à réécrire la ligne entière, en utilisant des références arrières pour les parties que vous souhaitez conserver:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

Une autre approche consiste à réécrire cette partie de la ligne, mais uniquement si une autre partie correspond:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

Les deux exemples réécrivent le deuxième mot délimité par des espaces sur les lignes où se trouve le premier mot projdir.

Gilles 'SO- arrête d'être méchant'
la source
3

Bien qu'il s'agisse d'un ancien poste et qu'il semble avoir été résolu pour vous par la réponse acceptée, la vraie question n'a pas été répondue. Donc pour être complet et pour aider les autres:

Voici la réponse qui correspond en fait à "Snake" et non aux lignes commençant par "projdir" ...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

Cela remplace tout depuis le début de la ligne, y compris "Snake" avec tout avant "Snake" + "PacMan". \ 1 représente ce qui correspond à l'intérieur (). Tout après "Snake" reste intact.

moritz
la source
1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir est de trouver la ligne qui commence par la chaîne projdir. Le. * $ Représente la chaîne après projdir dans la ligne la même ligne. La chaîne projdir PacMan est la chaîne avec laquelle nous remplaçons. g est pour global - pour remplacer toutes ces lignes commençant par projdir. .ignore est le nom du fichier

Tinu
la source
1
Pouvez-vous étendre votre réponse et préciser ce qui est quoi?
Romeo Ninov
Les réponses sont beaucoup plus utiles si elles comprennent des explications sur la façon et la raison pour laquelle une commande ou un morceau de code fonctionne.
Anthony Geoghegan
J'espère que cela sera plus utile après l'édition
Tinu