File1
Contenu:
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
File2
Contenu:
line1-file2 "25"
line2-file2 "24"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
Après l'exécution du script perl / shell, le File2
contenu devrait devenir:
line1-file2 "25"
line2-file2 "24"
line1-file1 "1"
line2-file1 "2"
line3-file1 "3"
line4-file1 "4"
Pointer-file2 "23"
line4-file2 "22"
line5-file2 "21"
c'est-à-dire collez le contenu de File1
in File2
avant la ligne qui contient "Pointer".
text-processing
awk
sed
perl
user1228191
la source
la source
Réponses:
sed
a une fonction pour cela, et peut faire la modification en ligne:Mais cela place votre ligne de pointeur au-dessus du fichier1. Pour le mettre ci-dessous, sortie ligne à retard:
la source
-e 1x -e '2,${x;p}' -e '${x;p}'
faire? Je comprends que vous échangez des trucs dans le tampon de motif, puis l'imprimez, mais je ne sais pas quoi ni pourquoi vous avez ajouté l'option silencieuse-n
au début.Sans utiliser
sed
ouawk
...Tout d'abord, trouvez votre ligne sur laquelle se trouve votre motif:
Ensuite, utilisez 3 commandes pour sortir le résultat souhaité:
Cela a l'inconvénient d'accéder à 3 fois le fichier
file2
, mais peut - être plus clair qu'unesed
deawk
solution.la source
awk
rend cela assez facile.Insérez la ligne avant le fichier:
Pour que le fichier interne s'imprime après la
Pointer
ligne, changez simplement l'ordre des motifs (vous devez ajouter un point-virgule pour obtenir l'action par défaut) et vous pouvez supprimer laline
variable:Et juste parce que personne n'a
perl
encore utilisé ,la source
system("cat innerfile")
renvoie leinnerfile
à la console. Est-ce que je manque quelque chose?Un travail facile pour
ed
:-r file1
lit dans le fichier spécifié après la ligne adressée, qui dans ce cas est la ligne précédant la première correspondance de lignePointer
. Ainsi, cela insérera le contenu d'file2
une seule fois même si celaPointer
se produit sur plusieurs lignes. Si vous souhaitez l'insérer avant chaque ligne correspondante, ajoutez leg
drapeau lobal:Remplacez
,p
parw
si vous souhaitez modifier le fichier sur place.La
sed
réponse acceptée fonctionne dans la plupart des cas, mais si le marqueur est sur la dernière ligne, la commande ne fonctionnera pas comme prévu: elle insérera le contenuFile1
après le marqueur.J'ai d'abord essayé avec:
qui fonctionne également très bien (comme le
r
fera sa magie à la fin du cycle) mais a le même problème si le marqueur est sur la dernière ligne (il n'y a pas deN
ligne ext après la dernière ligne). Pour contourner cela, vous pouvez ajouter une nouvelle ligne à votre entrée:Cela insérera du
file2
contenu avant chaque ligne correspondante. Pour l'insérer uniquement avant la première ligne correspondante, vous pouvez utiliser unl
oop et simplement tirer lan
ligne ext jusqu'à la fin du fichier:Avec ces
sed
solutions, vous perdez la possibilité de modifier sur place (mais vous pouvez rediriger vers un autre fichier).la source
Utilisez une boucle pour lire les lignes du fichier2. Si vous trouvez une ligne commençant par
Pointer
, imprimez le fichier 1. Ceci est illustré ci-dessous:la source
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:... 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 lar
commande DEE est appliquée par numéro de ligne.Vous pouvez le contourner:
Tous
sed
n'interpréteront pas le-
pour signifier entrée standard, mais beaucoup le font. ( POSIX indiquesed
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, etsed
l'appliquera etr
lira dans l'ordre de leur script. C'est un peu plus compliqué cependant - cela implique d'utiliser l'unsed
poura
mettre lePointer
match en correspondance avec la sortie d'un autresed
dans son script.Donc, fondamentalement, le premier
sed
écrit le secondsed
un script, que le secondsed
lit sur l'entrée standard (peut - être ...) et s'applique à son tour. Le premiersed
ne fonctionne que sur la première correspondance pour les élémentsPointer
trouvés, puis lesq
entrées. Son travail consiste à ...s/[]^$&\./*[]/\\&/g;H
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
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 secondesed
, puisx
modifiez lesh
anciens tampons et les tampons de modèle pour travailler sur notre copie enregistrée.s|.|r file1&a\\&|p;q
\n
lequel nous travaillons ici est une ligne électronique, carsed
elle en aura ajouté uneH
avant la dernière ligne. Nous insérons donc la commander file1
et la suivons avec notre\n
ewline puis la commandea\\
poura
ppend suivie également d'une\n
ewline. Tout le reste de notreH
ligne de champ suit cette dernière ligne\n
électronique.Le script que le premier écrit ressemble à ceci:
Fondamentalement, la seconde
sed
imprimera chaque ligne, mais celle que la premièresed
configure poura
ppend. Pour cette ligne particulière, deux écritures différées vers la sortie standard sont planifiées - la première est lar
tête de lecturefile1
et la seconde est une copie de la ligne que nous voulons après. Le premiersed
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.
la source
C'est assez simple avec AWK:
File1 dans File2 avant pattern = "Pointer"
Chargez d'abord le contenu de File1 dans une variable
puis faites l'insertion
(Ou, si vous souhaitez insérer File1 après "Pointer")
la source
ma façon préférée: les modèles .
Cela remplacera chaque occurrence CHANGEME dans origfile par le contenu de file2insert . Retirez le dernier g de sed pour remplacer uniquement la première occurrence de CHANGEME .
la source
$x
dans votre première commande, alors qu'elle n'est définie que dans votre deuxième commande?[Insérer le contenu du fichier dans un autre fichier AVANT le modèle]
[Après le motif]
la source
N
fonctionne bien, mais pas si le MOTIF correspond à la dernière ligne d'entréela source