Comment remplacer uniquement les lignes qui correspondent à plusieurs modèles dans sed?

8
$ echo -e 'CH12\nCH23au' | sed '/^CH/s=^=<b>='
<b>CH12
<b>CH23au

Je sais que je peux faire correspondre des lignes commençant CHpar ^CHmais comment puis-je faire correspondre plusieurs modèles?

Exemple:

Contribution:

CH12
CH23au

Production:

CH12
<b>CH23au

Comment ne mettre <b>que là où il y a ^CHet audans la ligne?

gasko peter
la source

Réponses:

8

Si le CHdoit se produire au début de la ligne, l'ordre de CHet auest fixe, vous pouvez donc rechercher ^CH.*au.

$ echo -e 'CH12\nCH23au' | sed '/^CH.*au/s=^=<b>='
CH12
<b>CH23au
$

Si l'ordre des deux motifs n'est pas fixe, on pourrait faire quelque chose comme

sed -e '/pattern1/{;/pattern2/s/old/new/;}'

mais la solution perl

perl -pe 'if (/pattern1/ && /pattern2/) {s/old/new/;}'

est probablement plus lisible.

Uwe
la source
5

Une autre approche:

sed -e '/^CH/!b' -e '/au/!b' -e 's/^/<b>/'

b(branche à la fin si aucun argument d'étiquette n'est donné) est similaire continueou nextdans d'autres langues. Donc, ce qui précède est comme:

for (; line = readline(); print line) { # The implicit loop in sed
  if (!/^CH/) continue;
  if (!/au/) continue;
  line =~ s/^/<b>/
}
Stéphane Chazelas
la source