Utilisation de grep + sed
Cela analysera le contenu de ces 2 chaînes:
$ grep -o '".*"' somefile | sed 's/"//g'
arch
arch2
Ce qui précède recherche une chaîne correspondant au modèle ".*"
. Cela correspondra à tout ce qui se produit entre guillemets doubles. Ainsi grep
, ces types de valeurs seront renvoyés:
"arch"
"arch2"
Le tuyau à sed
supprimer toutes les guillemets doubles de ces chaînes en vous donnant les chaînes que vous recherchez. La notation sed 's/"//g'
est instruisait sed
de faire une recherche et remplacer sur toutes les occurrences de guillemets doubles, les remplacer par rien, s/"//g
. La commande s/find/replace/g
est ce qui se passe là-bas, et la fin g
de la recherche lui dit de le faire globalement sur toute la chaîne qui lui est donnée.
Utilisation de sed
Vous pouvez également utiliser sed
pour couper le guillemet double de début, conserver ce qui se trouve entre les deux et couper le devis restant + tout ce qu'il y a après:
$ sed 's/^"\(.*\)".*/\1/' a
arch
arch2
Autres méthodes
$ grep -o '".*"' somefile | tr -d '"'
arch
arch2
La commande tr
peut être utilisée pour supprimer des caractères. Dans ce cas, il supprime les guillemets doubles.
$ grep -oP '(?<=").*(?=")' somefile
arch
arch2
En utilisant grep
la fonction PCRE de, vous pouvez rechercher toutes les sous-chaînes commençant par un guillemet double ou se terminant par un guillemet double et signaler uniquement la sous-chaîne.
tr -d \"
est une autre façon de supprimer les guillemets. (tr
traduit normalement un jeu de caractères en un autre; lui-d
dit de simplement les supprimer à la place.)/address/
tosed
like,sed '/^"\(arch[^"]*\)/s//\1/
vous n'opérerez que sur les lignes contenant cette chaîne.sed
devriez vraiment faires/^"\([^"]*\)".*/\1/
au cas où il n'y aurait que deux guillemets sur la ligne.C'est un autre travail pour
cut
:la source
cut
divise chaque ligne en champs en utilisant le guillemet comme délimiteur, puis affiche le champ 2: le champ 1 est la chaîne vide avant le premier devis, le champ 2 est la chaîne souhaitée entre les guillemets et le champ 3 est le reste de la ligne.Avec
sed
vous pouvez faire:Explication:
s/.../.../
- correspondre et remplacer^
- match en début de ligne\(...\)
- ceci est une référence arrière, nous pouvons nous référer à ce qui est apparié ici plus tard avec\1
[^"]*
- correspondre à toute séquence qui ne contient pas de"
(c'est-à-dire jusqu'à la suivante"
).*
- correspondre au reste de la ligne\1
- remplacer par la référence arrièreOu avec
awk
:Notez que dans les shells modernes, vous pouvez également utiliser un tableau au lieu d'une variable normale. En
bash
vous pouvez faire:Cela pourrait être plus facile lorsque vous utilisez la variable.
la source
En utilisant bash, j'écrirais:
la source
Et celui via grep oneliner avec
--perl-regexp
option,Explication:
(?<=^\")[^"]*
-> Un lookbehind est utilisé ici. Il correspond à n'importe quel caractère mais pas à"
zéro ou plusieurs fois (une fois qu'il trouve des guillemets doubles, il cesse de correspondre) qui se trouvent juste après les guillemets doubles (uniquement la ligne qui commence par des guillemets doubles).Un autre hack laid à travers
sed
,la source
puisque regex a des modes gourmands et non gourmands, si vous avez plusieurs cibles sur la même ligne, il ne sera pas extrait comme vous le souhaitez. Ligne:
Cible:
Commande (mode gourmand):
Commande (mode non gourmand):
la source