Considérer:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Cela correspondra aux lignes 3, 4 et 5.
Mais j'essaie de faire correspondre uniquement les lignes 3 et 5 (pas 4). Et ajoutez «test» après eux.
Considérer:
echo -e "a\nb\nc\nd\ne\nf\ng\nh" | sed '3,5a test'
Cela correspondra aux lignes 3, 4 et 5.
Mais j'essaie de faire correspondre uniquement les lignes 3 et 5 (pas 4). Et ajoutez «test» après eux.
Réponses:
echo ... | sed -e '3a test' -e '5a test'
Si l'opération est plus complexe que dans ce cas, vous pouvez utiliser une structure comme celle-ci:
sed 'b pattern; : action; a \
lalala
b end; : pattern; 3b action; 5b action; : end'
C'est-à-dire que vous mettez toutes les commandes dont vous avez besoin entre b pattern;
et b end;
.
Et vous ajoutez tous vos modèles (numéros de ligne ou autre) après : pattern;
.
Ce qui se passe est le suivant:
La première commande saute sur la partie action (il est peut-être plus facile de lire si les motifs sont au début et b end;
juste avant la partie action).
Si un modèle correspond, l'exécution passe à la partie action. Après l'exécution, l'exécution de la partie passe à la fin.
J'essaye de ranger ça:
sed '3b action; 5b action; b end; : action; a \
lalala
: end'
En une seule ligne serait comme:
sed "3b idAction; 5b idAction; b; : idAction; a test"
Portablement, vous devez l'écrire:
sed '
3b action
5b action
b
: action
a\
lalala'
( b
sans les branches d'étiquette à la fin, vous n'avez donc pas besoin d'une end
étiquette explicite , ;
c'est un caractère valide dans une étiquette dans les sed
implémentations standard ).
Avec sed
(voir la réponse de @ HaukeLaging )
Avec awk
:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | awk 'NR==3 || NR==5{$0=$0"\ntest"}1;'
Avec perl
:
$ echo -e "a\nb\nc\nd\ne\nf\ng\nh" | perl -pe '$_ .="test\n" if $. == 3 || $. == 5'
perl -lnE 'say if $. ~~ @{[3,5]}'
~~
, je ne le comprends pas aussi bien que je le devrais. Aussi, les deux say
et ont ~~
besoin de perl v> = 5.10 non?
perl -pE 'say "test" if $. ~~ @{[4,6]}'
- ceci ajoute la ligne: perl -p
fait une impression implicite à la fin du programme donné.
Comme l'a déjà dit @HaukeLaging, cette commande fait ce que vous voulez:
sed -e'3a test' -e'5a test'
Maintenant, cela peut devenir assez lourd à taper si vous voulez faire correspondre, par exemple, 20 lignes.
Dans ces cas, en supposant que votre shell prend en charge l' expansion d'accolade , vous pouvez utiliser cette commande à la place:
sed -e{3,5}'a test'
(Notez que les accolades et la virgule doivent rester sans guillemets.)
En conséquence, le shell passera les arguments à -e3a test
et -e5a test
à sed, ce qui est exactement ce que fait la première commande.