Substitution de la première occurrence d'un motif dans une ligne, pour toutes les lignes d'un fichier avec sed

16

Est-il possible de le faire dans une doublure?

J'ai une sortie comme celle-ci:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

Cette entrée est générée automatiquement.

Je veux remplacer la première occurrence de "(guillemet + espace) par "(guillemet) pour chaque ligne. Si j'applique la substitution à l'échelle mondiale, cela changera également chaque occurrence de line" -en line"-, donc je me demandais s'il était possible d'utiliser un liner sed pour y parvenir.

J'ai essayé d'utiliser ^comme ça

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

Mais ça ne marche pas, ça ne remplace rien. j'ai essayé

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

et il remplace toutes les occurrences. Je viens de commencer à utiliser sed, donc je ne sais pas vraiment si je fais quelque chose de mal.

Qu'est-ce que j'oublie ici?

Steve B.
la source
Remarque sur les étiquettes: la commande que vous avez écrite ci-dessus peut fonctionner dans certaines implémentations de sed, mais pour la portabilité et pour éviter des erreurs vraiment étranges, vous devez terminer un argument de commande donné après une étiquette (si vous en avez besoin). Par exemple,sed -e ':a' -e 'N;$!ba' -e 'whatever'
Wildcard

Réponses:

34

Vous y pensez trop. sedremplace uniquement la première instance sur une ligne par défaut (sans le /gmodificateur), bien que vous souhaitiez toujours ancrer parce que vous ne souhaitez pas tant la première instance de la ligne que celle au début de la ligne; et vous n'avez généralement pas besoin des actions de ligne explicites que vous essayez d'utiliser (pourquoi?).

sed 's/^" /"/'
geekosaure
la source
Merci! J'ai pensé qu'il était nécessaire de déclarer explicitement les actions de ligne lorsque vous travaillez sur un fichier, de le lire et de continuer à les utiliser. J'y pensais vraiment trop, ça ne pourrait pas être plus simple et ça fait l'affaire :)
Steve B.
Je suis tenté de dire que ces commandes sont à peu près obsolètes; il est possible de faire des choses multilignes assez complexes avec eux, mais ce n'est pas facile à faire et de nos jours, il vaut mieux utiliser à la place perl / python / ruby ​​/ peu importe.
geekosaur
Entièrement en désaccord avec le commentaire ci-dessus; Les sedcommandes multilignes telles que Net les étiquettes telles que :ane sont pas du tout obsolètes et elles sont portables et spécifiées POSIX , contrairement à Perl / Python / Ruby / peu importe. Il est vrai cependant que si vous en avez souvent besoin , vous devriez apprendreawk .
Wildcard
2

Une réponse plus générale, car je ne peux pas commenter la réponse du geekosaure - Vous ne mettriez pas le ^ (début de l'ancre de ligne). Par exemple, si vous voulez remplacer la première occurrence de A par B, vous auriez

sed 's/A/B/'
spectre
la source