web-dev-qa-db-fra.com

Comment grep et obtenir uniquement une chaîne correspondante?

N'hésitez pas à modifier le titre car il ne correspond pas à ma question 100%

J'ai quelque chose comme ça dans un fichier:

junk
long_ass_string "/I/want/this/$code/$name" long_ass_string
junk

Clarification de l'exemple:

  • La partie / i/ceci / partie est toujours la même
  • $ code et $ nom sont dynamiques et différents pour chaque chaîne
  • Inside long_ass_string Il peut y avoir plus / i/want/this/$ code/$ nom Cordes et j'aimerais tous les obtenir.
  • Les guillemets (ceci => -") sont présents dans tous les / i/want/this/$ code/$ nom String.

Jusqu'à présent j'ai essayé ...

grep -w "/I/want/this/*" file # sorties long_ass_string
[.____] grep -o "/I/want/this/*" file # sorties/je/veux/ceci /

Aimerait éviter d'utiliser la solution d'obtenir uniquement des caractères supplémentaires avant et/ou après

4
sysfiend

J'irais avec grepping toutes les cordes puis trier avec un deuxième grep, par exemple:

grep -o '"[^"]*"' file

Production:

"/I/want/this/$code/$name"

Commentaire sur votre utilisation d'expressions régulières

Cette expression /I/want/this/* allumettes /I/want/this, puis zéro ou plus de caractères slash, vous vouliez probablement dire: /I/want/this/.* qui correspond à /I/want/this/ et zéro ou plus de caractères.

4
Thor

si je vous comprends bien, vous voulez vous débarrasser de la première carte $ et une variable de nom $ dans chaque ligne. Vous pouvez tuyer votre résultat pour couper pour cela. Suite à votre exemple:

grep "/I/want/this/" myfile.txt | cut -d '/' -f 1-4,7-

avec -d Vous définissez le délimiteur (le symbole / par exemple) et avec -f Vous indiquez que le champ à saisir.
[.____] Dans ce cas, du délimiteur 1 à 4 (/I/want/this/) Et tous les champs qui arrivent après le septième délimiteur (qui se fait avec argument 7-) Comme ça, vous enlevez /$code/$name qui sont entre 4ème et 7e délimiter dans toutes les lignes correspondant à l'expression régulière définie.

echo "/I/want/this/NOT/THAT/and/everythingelse" | grep "/I/want/this/" | cut -d '/' -f 1-4,7- 
/I/want/this/and/everythingelse
0
kcdtv