2010-12-15 8 views
0

J'ai un fichier contenant (un par ligne). Je voudrais extraire le mot entre guillemets commençant par le motif. (Dans mon cas, il est C_)En utilisant bash (bash awk, sed) lire un fichier et extraire le préfixe correspondant entre guillemets

"PATTERNabcde" sdfds sdfds 
"sdfsdfsdf" sdfdsf sdfdsf 
" PATTERNabc"   dfdsdfd 

et je veux extraire: PATTERNabcdePATTERNabc

EDIT:
Je voudrais aussi extraire mot entre guillemets qui ne commencent pas avec le $PATTERN .

+1

Quelle parenthèse? Voulez-vous dire des citations? – jkerian

+0

cite .. .sorry – vehomzzz

Répondre

2

Vous pouvez utiliser awk:

awk -F\" '$2~/^[[:space:]]*PATTERN/{print $2}' file 

Cela fonctionne s'il n'y a qu'un seul mot entre guillemets ou si une qui peut commencer avec le motif est toujours le premier; sinon, vous devez utiliser un cycle:

awk -F\" '{for (i=2;i<=NF;i+=2) if ($i ~/^[[:space:]]*PATTERN/) {print $i;next}}' 
+0

veuillez expliquer ce parrt ** \ "'$ 2 ~/^ [[: space:]] * PATTERN/** .... merci – vehomzzz

+0

-F \" force à utiliser "comme séparateur de champs, puis pour chaque ligne , si le second champ (le mot entre guillemets) commence par zéro ou plusieurs espaces suivis par PATTERN, il l'imprime simplement. – marco

2
sed -rn 's/.*?".*?(PATTERN[^"]*)".*/\1/p' 
  • -r - regex étendu
  • -n - impression automatique désactivé
  • .*? - zéro ou plusieurs caractères,
  • non avides
  • ( - groupe capture ouvert
  • [^"] - tout caractère mais "
  • ) - groupe de capture près
  • \1 - premier groupe correspondant
  • p - imprimer

Nous remplaçons simplement chaque ligne avec le premier groupe. S'il y a un remplacement, nous imprimons.

+0

c'est génial bien qu'il échoue sur "$ {MODÈLE} abc $ {PATTERN} ghi" il renvoie $ PATTERNghi – vehomzzz

+0

@vehom, vous n'avez pas dit qu'il pourrait y avoir plus d'un par ligne. –

+0

désolé, j'ai dit qu'il commence par $ PATTERN entre parenthèses, ce qui implique que tout peut suivre $ PATTERN y compris $ PATTERN, tant que le mot se termine avant la parenthèse fermante. Et correspond à un seul mot par ligne. J'ai toujours upvoted votre réponse =) – vehomzzz

2

Vous pouvez utiliser grep comme:

grep -Po '(?<=")\s*PATTERN[^"]*(?=")' file 

See it

Questions connexes