Le Concept de "Hold espace" et de "Modèle de l'espace" de sed
Je suis de confondre les deux concepts de sed: organiser l'espace et le modèle de l'espace. Quelqu'un peut-il expliquer?
Voici un extrait du manuel:
h H Copy/append pattern space to hold space. g G Copy/append hold space to pattern space. n N Read/append the next line of input into the pattern space.
Ces six commandes de vraiment me confondre.
- Essayez-le vous-même:
echo $'1\n2\n3\n4' | sed -n '1~2h;2~2{p;x;p}'
- Ne pas confondre, il suffit de ne pas les utiliser. Pour autre chose que de simples substitutions sur une seule ligne, vous devez utiliser awk, pas de sed. Tenir des espaces, le motif, les espaces, et 95% de la sed constructions de langage a été inventé avant awk quand il n'y a pas de meilleure alternative. Ils sont devenus obsolètes dès que awk a été inventé au milieu des années 1970 et ne sont conservés vivants aujourd'hui par des gens qui aiment résoudre des problèmes à l'aide de sed arcanes de la syntaxe plutôt que de le faire simplement et cearly en awk. Si vous utilisez plus de s, g, et p (- n) dans sed, alors vous êtes presque certainement à l'aide de l'outil erroné.
- Morton awk travaille avec des données structurées (chaque ligne a la même structure). Sed est destinée à travailler avec des données aléatoires. Donc vous ne pouvez pas simplement utiliser awk au lieu de sed.
- Je recommande fortement de lire
info sed
. Il est beaucoup plus détaillé que le nu de la page de man. - Si vous souhaitez examiner un complexe d'expression, vous pouvez utiliser
l
. Il imprime le modèle actuel de l'espace. - Je suis d'accord avec Pithikos. Je suis allé en bas de la voie que Morton a fait, et me suis posé la même question que Morton a fait. Cependant, je n'ai pas encore de rejeter sed facilement.
- est-il une commande pour imprimer emprise actuelle de l'espace?
Vous devez vous connecter pour publier un commentaire.
Quand sed lit un fichier ligne par ligne, la ligne qui a été en cours de lecture est inséré dans le modèle tampon (modèle de l'espace). Le tampon de motif, c'est comme la mémoire tampon temporaire, le pavé où l'information est stockée. Quand vous dites sed pour imprimer, il imprime le tampon de motif.
Tampon /hold espace est comme un stockage à long terme, de sorte que vous pouvez attraper quelque chose, de la stocker et de la réutiliser plus tard lors de la sed est le traitement d'une autre ligne. Vous n'avez pas de traiter directement les contenir d'espace, au lieu de cela, vous avez besoin de copier ou de compléter le modèle de l'espace si vous voulez faire quelque chose avec elle. Par exemple, la commande d'impression
p
imprime le modèle de l'espace de seulement. De même,s
fonctionne sur le modèle de l'espace.Voici un exemple:
(l'option-n supprime l'impression automatique de lignes)
Il y a trois commandes ici:
1!G
,h
et$p
.1!G
a une adresse,1
(première ligne), mais la!
signifie que la commande sera exécutée partout mais sur la première ligne.$p
d'autre part ne sera exécuté que sur la dernière ligne. Donc voilà ce qui se passe:h
des copies de la première ligne dans le tenir de l'espace.G
, en y ajoutant le contenu du tampon de la tampon de motif, en le séparant par un saut de ligne. Le modèle de l'espace contient maintenant la deuxième ligne, une nouvelle ligne, et la première ligne.h
commande insère la concaténation de contenu du tampon de motif dans la cale de l'espace, qui détient désormais le inversée lignes deux et un.Enfin, après la dernière ligne a été lu et l'emprise de l'espace (contenant toutes les lignes précédentes dans l'ordre inverse) ont été ajoutés à la structure de l'espace, le motif de l'espace est imprimé avec
p
. Comme vous l'avez deviné, le ci-dessus ne fait exactement ce que letac
commande n' -- imprime le fichier dans le sens inverse.'195,210{/add/p}'
... est-il possible d'extraire la dernière ligne d'un groupe de ligne impliqués dans un modèle?@Ed Morton: je suis en désaccord avec vous ici. J'ai trouvé
sed
très utile et très simple (une fois que vous grok le concept de la répétition et de buffers) de venir avec un moyen élégant de faire multiligne grepping.Par exemple, prenons un fichier texte qui comporte des noms d'hôtes et des informations sur chaque hôte, avec beaucoup de cochonneries entre les deux que je ne se soucient.
Pour moi, un script awk pour obtenir juste les lignes par le nom d'hôte et le correspondant
info
ligne prendrait un peu plus de ce que je suis capable de faire avec sed:de sortie ressemble à ceci:
(Notez que
Host: foo1
apparaît deux fois dans la production.)Explication:
-n
désactive la sortie, sauf si explicitement impriméHost:
ligne dans le buffer de saisie (h)Host:
ligne, puis re-échanges (x) et les estampes (p) l'Info: ligne.Oui, c'est un exemple simpliste, mais je suppose que c'est un problème commun qui a été rapidement traitée par un simple sed one-liner. Pour beaucoup de tâches plus complexes, telles que celles dans lesquelles vous ne pouvez pas compter sur une donnée, séquence prévisible, awk peut être mieux adapté.
grep 'Host\|Info'
awk
équivalent de votre sed code est assez court aussi:awk '/Host:/{hold=$0}; /Info/{print hold; print;}' myfile.txt
Bien que @janvier la réponse de l'exemple de nice, l'explication n'était pas assez pour moi. J'ai dû chercher et apprendre beaucoup de choses jusqu'à ce que j'ai réussi à comprendre exactement comment
sed -n '1!G;h;$p'
œuvres. Donc j'aimerais des précisions sur la commande pour quelqu'un comme moi.Tout d'abord, nous allons voir ce que fait la commande.
Il inverse l'entrée comme
tac
commande.sed
lit ligne par ligne, donc nous allons voir ce qui se passe sur le patten espace et la contenir d'espace au niveau de chaque ligne. Commeh
commande copie le contenu du modèle de l'espace pour la contenir d'espace, les deux espaces ont le même texte.À la dernière ligne,
$p
imprimed\nc\nb\na$
qui est mis en forme àSi vous souhaitez voir le modèle de l'espace pour chaque ligne, vous pouvez ajouter un
l
commande.Je l'ai trouvé très utile de regarder cette vidéo tutoriel Comprendre comment sed œuvres, comme le gars montre comment chaque espace sera utilisé, étape par étape. La cale espacées est mentionné dans le 4ème tutoriel, mais je vous conseille de regarder toutes les vidéos si vous n'êtes pas familier avec
sed
.Aussi GNU sed document et Bruce Barnett Sed du tutoriel sont de très bonnes références.