2011-10-26 5 views
3

avoir ce fichierligne append sed sur 1 seule occurrence

ServerName * 
ServerAlias * 
ServerAlias * 

<Directory> 

Je veux ajouter une nouvelle ligne après la première apparition de ServerAlias ​​avec le texte S2. J'ai essayé ce qui suit

sed '/ServerAlias/ a\S2\' foo 

Mais après toutes les concatène occurrences.

Mon résultat final devrait être

ServerName * 
ServerAlias * 
S2 
ServerAlias * 

<Directory> 

Répondre

5

En fait, ce n'est pas sed, awk mais peut-être peut vous aider.

$> cat ./file 
ServerName * 
ServerAlias * 
ServerAlias * 

<Directory> 

$> awk '{print} /^ServerAlias/ && !n {print "S2"; n++}' ./file 
ServerName * 
ServerAlias * 
S2 
ServerAlias * 

<Directory> 

UPD: erreur est maintenant corrigé, merci glenn_jackman

+1

Vous devrez probablement ancrer l'expression rationnelle pour éviter de faire correspondre "ServerAlias" dans les commentaires. –

+1

Pour éviter d'imprimer deux fois la ligne correspondante, utilisez: 'awk '{print}/^ ServerAlias ​​/ &&! N {print" S2 "; n ++} 'file' –

+0

Fixe. Merci pour la grande observation. –

1

La solution awk ci-dessus est le meilleur, mais si vous voulez vraiment faire dans (GNU) sed alors le fait de suivre l'affaire:

sed '0,/^ServerAlias.\+/s//\0\nS2/' file 

Le crédit passe à the sed FAQ.

+0

C'était un peu bogué si j'ai répété la commande plusieurs fois. Probablement, cela dépend des indications du système d'exploitation. Au lieu de cela, j'ai utilisé ServerName en tant que cible, pour ajouter un ServerAlias ​​après. –

+0

En relation avec le problème de fin de ligne potentiel: http://stackoverflow.com/questions/6111679/insert-linefeed-in-sed – cmbuckley

Questions connexes