Je pense que ce que vous cherchez est sed
... c'est un de tream ed Itor qui vous permettra de faire des remplacements sur une base ligne par ligne.
Comme vous l'expliquez, la commande `cat named.local | zone grep » vous donne une sortie un peu comme ceci:
zone "domain1.tld" {
zone "domain2.tld" {
zone "domain3.tld" {
zone "domain4.tld" {
Je devine que vous voulez que la sortie soit quelque chose comme ça, puisque vous avez dit que vous avez besoin le texte entre guillemets:
"domain1.tld"
"domain2.tld"
"domain3.tld"
"domain4.tld"
donc, en réalité, de chaque ligne, nous voulons que le texte entre les guillemets doubles (y compris les guillemets doubles eux-mêmes.)
Je ne suis pas sûr que vous êtes familier avec Regular Expressions, mais ils sont un outil précieux pour toute personne qui écrit des scripts shell. Par exemple, l'expression régulière /.o.e/
correspondrait à n'importe quelle ligne où il y a un mot avec la 2ème lettre était une minuscule o
et la 4ème était e
. Cela correspondrait à chaîne contenant des mots comme « zone
», « tone
», ou même « I am tone-deaf.
»
L'astuce était d'utiliser le caractère .
(point) pour signifier « toute lettre ». Il y a quelques autres caractères spéciaux, tels que *
qui signifie "répéter le caractère précédent 0 fois ou plus". Ainsi, une expression régulière comme a*
correspondrait à « a
», « aaaaaaa
», ou une chaîne vide: « »
vous pouvez donc correspondre à la chaîne dans les citations en utilisant: /".*"/
Il y a une autre chose que vous sauriez sed
(et par les commentaires, vous le faites déjà!) - Il permet retour arrière. Une fois que vous lui avez dit comment reconnaître un mot, vous pouvez l'utiliser dans le cadre du remplacement. Par exemple, disons que vous vouliez tourner cette liste:
Billy "The Kid" Smith
Jimmy "The Fish" Stuart
Chuck "The Man" Norris
Dans cette liste:
The Kid
The Fish
The Man
D'abord, vous auriez l'air de la chaîne à l'intérieur des guillemets. Nous l'avons déjà vu, c'était /".*"/
.
Ensuite, nous voulons utiliser ce qu'il y a dans les guillemets.Nous pouvons groupe à l'aide parens: /"(.*)"/
Si nous voulions remplacer le texte avec les guillemets avec un trait de soulignement, nous ferions un remplacement: s/"(.*)"/_/
, et qui nous laisse avec:
Billy _ Smith
Jimmy _ Stuart
Chuck _ Norris
Mais nous avons fait marche arrière! Cela nous permet de nous souvenir de ce qui se trouvait à l'intérieur des parens, en utilisant le symbole \1
. Donc, si nous le faisons maintenant: s/"(.*)"/\1/
nous obtenons:
Billy The Kid Smith
Jimmy The Fish Stuart
Chuck The Man Norris
Parce que les citations ne sont pas dans les parens, ils ne faisaient pas partie du contenu de \1
!
Pour ne laisser que le contenu entre guillemets, nous devons faire correspondre toute la ligne. (. Ce qui signifie « fin de ligne ») Pour ce faire, nous avons ^
(qui signifie « début de la ligne »), et $
Alors maintenant, si nous utilisons s/^.*"(.*)".*$/\1/
, nous obtenons:
The Kid
The Fish
The Man
Pourquoi? Lisons l'expression régulière de s/^.*"(.*)".*$/\1/
à droite à gauche:
En clair:. « Lire toute la ligne, la copie de côté le texte entre les guillemets doubles remplacer ensuite toute la ligne avec le contenu entre les doubles qoutes."
Vous pouvez même ajouter des guillemets autour du texte remplaçant s/^.*"(.*)".*$/"\1"/
, nous allons donc obtenir:
"The Kid"
"The Fish"
"The Man"
et qui peut être utilisé par sed
pour remplacer la ligne avec le contenu à l'intérieur des guillemets:
sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
(Ceci est juste coquille échappé à traiter les guillemets doubles et des barres obliques et d'autres choses.)
donc toute la commande wo ULD quelque chose comme:
cat named.local | grep zone | sed -e "s/^.*\"\(.*\)\".*$/\"\1\"/"
Eh oui, je l'utilise en ce moment, mais je pense qu'il devrait être plus facile de le faire, parce que maintenant j'utilise -e 's/zone « // g sed | sed -e' s /" { // g 'pour supprimer le début et la fin d'un fichier au lieu de simplement correspondre au milieu. – jpou
Raser le début et la fin est parfaitement acceptable. Ce n'est pas un concours - si ça marche, ça va. Si vous voulez le faire en faisant correspondre le texte entre guillemets, jetez un oeil à 'capturer des groupes'. – zoul
J'ai passé trop de temps à taper dessus, et ce n'est toujours pas fait ... il semble que tout le monde m'a battu. Mais je suis content que vous l'ayez déjà compris :-) – scraimer