Il y a plusieurs façons de procéder à ce sujet avec sed
. Une façon est une lecture différée, comme recommandé dans la réponse acceptée. Il pourrait également s'écrire comme:
sed -e '$!N;P;/\nPointer/r file1' -e D file2
... avec un peu d'anticipation explicite au lieu de l'anticipation implémentée ailleurs avec le tampon de retenue. Cela inévitablement le même problème avec la dernière ligne que les notes @don_crissti, cependant, parce que N
ne incrément le cycle de la ligne et la r
commande DEE est appliquée par numéro de ligne.
Vous pouvez le contourner:
echo | sed -e '$d;N;P;/\nPointer/r file1' -e D file2 -
Tous sed
n'interpréteront pas le -
pour signifier entrée standard, mais beaucoup le font. ( POSIX indique sed
que le support devrait -
signifier entrée standard si l'implémenteur veut -
signifier entrée standard ???)
Une autre façon consiste à gérer le contenu ajouté dans l'ordre. Il existe une autre commande qui planifie la sortie de la même manière que r
ead, et sed
l'appliquera et r
lira dans l'ordre de leur script. C'est un peu plus compliqué cependant - cela implique d'utiliser l'un sed
pour a
mettre le Pointer
match en correspondance avec la sortie d'un autre sed
dans son script.
sed ' /Pointer/!d #only operate on first match
s/[]^$&\./*[]/\\&/g;H #escape all metachars, Hold
s|.*|/&/!p;//!d|p;g #print commands, exchange
s|.|r file1&a\\&|;q' file2| #more commands, quit
sed -nf - file2 #same input file
Donc, fondamentalement, le premier sed
écrit le second sed
un script, que le second sed
lit sur l'entrée standard (peut - être ...) et s'applique à son tour. Le premier sed
ne fonctionne que sur la première correspondance pour les éléments Pointer
trouvés, puis les q
entrées. Son travail consiste à ...
s/[]^$&\./*[]/\\&/g;H
- Assurez-vous que tous les caractères du modèle sont échappés par une barre oblique inversée, car le second
sed
devra interpréter chaque bit qu'il lit littéralement pour le faire correctement. Une fois cela fait, mettez une copie dans l' H
ancien espace.
s|.*|/&/!p;//!d|p; x
- Dites à la seconde
sed
d' p
imprimer chaque ligne d'entrée, !
mais /&/
celle que nous venons de sauvegarder en mode; puis à d
tout de même disparaître. p
réimprimez les commandes à la seconde sed
, puis x
modifiez les h
anciens tampons et les tampons de modèle pour travailler sur notre copie enregistrée.
s|.|r file1&a\\&|p;q
- Le seul caractère avec
\n
lequel nous travaillons ici est une ligne électronique, car sed
elle en aura ajouté une H
avant la dernière ligne. Nous insérons donc la commande r file1
et la suivons avec notre \n
ewline puis la commande a\\
pour a
ppend suivie également d'une \n
ewline. Tout le reste de notre H
ligne de champ suit cette dernière ligne \n
électronique.
Le script que le premier écrit ressemble à ceci:
/Pointer-file2 "23"/!p;//!d
r file1
a\
Pointer-file2 "23"
Fondamentalement, la seconde sed
imprimera chaque ligne, mais celle que la première sed
configure pour a
ppend. Pour cette ligne particulière, deux écritures différées vers la sortie standard sont planifiées - la première est la r
tête de lecture file1
et la seconde est une copie de la ligne que nous voulons après. Le premier sed
raclage n'est même pas nécessaire dans ce cas (voir? Pas de barre oblique inverse) mais il est important de s'échapper en toute sécurité comme je le fais ici chaque fois qu'une correspondance de modèle est réaffectée en entrée.
Quoi qu'il en soit, alors ... il y a plusieurs façons.