La manière portable de le faire - et la manière la plus efficace - est d'utiliser les adresses. Tu peux le faire:
printf %s\\n cat dog pear banana cat dog |
sed -e '/cat/!{/dog/!b' -e '};cBear'
De cette façon, si la ligne ne contient pas la chaîne cat et ne contient pas la chaîne dog sed
b
ranches hors du script, imprime automatiquement sa ligne actuelle et tire sur la ligne suivante pour commencer le cycle suivant. Par conséquent, il n'exécute pas l'instruction suivante - qui, dans cet exemple, c
suspend la ligne entière pour lire Bear, mais il pourrait tout faire.
Il est probablement intéressant de noter également que toute déclaration suivante la !b
dans cette sed
commande peut ne correspondre sur une ligne contenant soit la chaîne dog
ou cat
- de sorte que vous pouvez effectuer d' autres tests sans danger de faire correspondre une ligne qui ne fonctionne pas - ce qui signifie que vous pouvez maintenant appliquer les règles à l'un ou à l'autre aussi.
Mais c'est la prochaine. Voici la sortie de la commande ci-dessus:
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Vous pouvez également implémenter de manière portative une table de recherche avec des références arrières.
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ cat dog /;x
};G;s/^\(.*\)\n.* \1 .*/Bear/;P;d'
C'est beaucoup plus de travail à configurer pour ce cas d'exemple simple, mais cela peut rendre les sed
scripts beaucoup plus flexibles à long terme.
Dans la première ligne, je x
change l'espace de maintien et l'espace de motif, puis insère le chien <space>
chat à<space>
<space>
cordes dans l'espace de maintien avant de les x
changer de nouveau.
À partir de là et sur chaque ligne suivante, je G
maintiens l'espace ajouté à l'espace de motif, puis vérifie si tous les caractères depuis le début de la ligne jusqu'à ce que la nouvelle ligne que je viens d'ajouter à la fin correspondent à une chaîne entourée d'espaces après. Si c'est le cas, je remplace tout le lot par Bear et sinon il n'y a pas de mal parce que je P
n'imprime ensuite que jusqu'à la première nouvelle ligne apparaissant dans l'espace de motif, puis d
je supprime tout cela.
###OUTPUT###
Bear
Bear
pear
banana
Bear
Bear
Et quand je dis flexible, je le pense. Ici, il remplace chat avec Ours brun et chien avec Ours noir :
printf %s\\n cat dog pear banana cat dog |
sed '1{x;s/^/ 1cat Brown 2dog Black /;x
};G;s/^\(.*\)\n.* [0-9]\1 \([^ ]*\) .*/\2Bear/;P;d'
###OUTPUT###
BrownBear
BlackBear
pear
banana
BrownBear
BlackBear
Vous pouvez bien sûr développer beaucoup le contenu de la table de recherche - j'ai repris l'idée des courriels usenet de Greg Ubben sur le sujet quand, dans les années 90, il a décrit comment il a construit une calculatrice brute à partir d'une seule sed s///
déclaration.
-r
option comme synonyme de-E
compatibilité avec GNU sed. OpenBSD et OS Xsed -E
interpréteront le tuyau échappé comme un tuyau littéral, et non comme un opérateur d'alternance. Voici un lien de travail vers la page de manuel NetBSD et en voici un pour OpenBSD qui n'a pas dix ans.