2011-05-02 3 views
11

J'essaie d'utiliser sed pour remplacer toutes les autres occurrences d'un élément html d'un fichier afin que je puisse faire alterner les rangées de couleurs.Sed remplacer toutes les occurrences nième

Voici ce que j'ai essayé et cela ne fonctionne pas.

sed 's/<tr valign=top>/<tr valign=top bgcolor='#E0E0E0'>/2' untitled.html 

Répondre

10

Je résous avec awk:

awk '/<tr valign=top>/&&v++%2{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")}{print}' untitled.html 

Tout d'abord, il vérifie si la ligne contient <tr valign=top>

/<tr valign=top>/&&v++%2 

et si le <tr valign=top> est une instance trouvée bizarre:

v++%2 

Si oui, il remplace le <tr valign=top> dans la ligne

{sub(/<tr valign=top>/, "<tr valign=top bgcolor='#E0E0E0'>")} 

Étant donné que toutes les lignes sont à imprimer, il y a un bloc qui sera toujours exécuté (pour toutes les lignes) et imprime la ligne courante:

{print} 
3

Cela fonctionne pour moi:

sed -e "s/<tr/<TR bgcolor='#E0E0E0'/g;n" simpletable.htm 

entrée échantillon:

sortie
<table> 
    <tr><td>Row1/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row2/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row3/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row4/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row5/col1</td><td>col2</td><td>col3</td></tr> 
</table> 

exemple:

<table> 
    <TR bgcolor='#E0E0E0'><td>Row1/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row2/col1</td><td>col2</td><td>col3</td></tr> 
    <TR bgcolor='#E0E0E0'><td>Row3/col1</td><td>col2</td><td>col3</td></tr> 
    <tr><td>Row4/col1</td><td>col2</td><td>col3</td></tr> 
    <TR bgcolor='#E0E0E0'><td>Row5/col1</td><td>col2</td><td>col3</td></tr> 
</table> 

La clé consiste à utiliser la commande n dans sed, qui passe à la ligne suivante. Cela ne fonctionne que si les TR occupent des lignes distinctes. Il va rompre avec les tables imbriquées, ou s'il y a plusieurs TR sur une seule ligne.

+0

En outre, cette commande ne fonctionne que s'il n'y a rien, sauf 'tr's in row, non? Le 'tr' devrait commencer et finir dans la même ligne et ne peut pas avoir de lignes vides entre eux. Ai-je raison? (Néanmoins, je trouve votre solution très instructive car je ne suis pas habitué à la commande 'n'). – brandizzi

+0

Il remplace chaque occurrence impaire, mais comment la modifier pour chaque occurrence paire? – Offenso

0

Selon http://www.linuxquestions.org/questions/programming-9/replace-2nd-occurrence-of-a-string-in-a-file-sed-or-awk-800171/

Essayez ceci.

sed '0,/<tr/! s/<tr/<TR bgcolor='#E0E0E0'/' file.txt 

Le point d'exclamation nie tout depuis le début du fichier au premier « Jack », de sorte que la substitution fonctionne sur toutes les lignes suivantes. Notez que je crois que c'est une opération de gnu sed seulement.

Si vous ne devez utiliser que la deuxième occurrence et ignorer les correspondances suivantes, vous pouvez utiliser une expression imbriquée.

sed '0,/<tr/! {0,/<tr/ s/<tr/<TR bgcolor='#E0E0E0'/}' file.txt 

Ici, l'expression entre crochets fonctionnera sur la sortie de la première partie, mais dans ce cas, il quitte après avoir modifié la première correspondance « Jack ». PS, j'ai trouvé le sed faq très utile dans des cas comme celui-ci.

Questions connexes