2009-08-08 10 views
45

Sono bloccato nel tentativo di annullare qualcosa appena dopo name=, includere solo spazi e caratteri alfanumerici.Come usare grep per ottenere qualcosa subito dopo `name =`?

es .:

name=some value here 

ottengo

some value here 

Sono totalmente newb in questo, il seguente grep partita tutto compreso il name=.

grep 'name=.*' filename 

Qualsiasi aiuto è molto apprezzato.

risposta

76

Come dettagliato here, si vuole una clausola lookbehind positiva, come ad esempio:

grep -P '(?<=name=)[ A-Za-z0-9]*' filename 

Il -P rende grep usare il dialetto Perl, altrimenti si sarebbe probabilmente bisogno di fuggire le parentesi. È anche possibile, come indicato altrove, aggiungere il parametro -o per stampare solo ciò che corrisponde. La parte tra parentesi indica che si desidera alfanumerici e spazi.

Il vantaggio dell'utilizzo di una clausola di lookbehind positiva è che il testo "name =" non fa parte della corrispondenza. Se grep evidenzia il testo, questo evidenzierà solo la parte alfanumerica (e gli spazi). Il parametro -o non mostrerà anche la parte "name =". E se lo trasferisci su un altro programma come sed che potrebbe catturare il testo e fare qualcosa con esso, non catturerai la parte "name =", anche se puoi farlo usando la cattura dei parenthess.

+2

grep supporta effettivamente il lookbehind positivo? –

+1

Ero preoccupato anche per questo, quindi l'ho provato sul mio PC Windows, ed è per questo che ho dovuto usare il parametro -P. Probabilmente lo supporta negli altri sapori (forse non -G), ma non sapevo la corretta fuga per gli elementi. Sto usando grep 2.5.1. – markets

+0

Ho capito con grep -P: grep: il supporto per l'opzione -P non è compilato in questo Questo è su Ubuntu Hardy (Linux 2.6.24). Su un'altra macchina Linux ha fallito con un messaggio di errore leggermente diverso, e anche su Solaris 10. –

1

grep stamperà l'intera riga dove corrisponde al modello. Per stampare solo il modello abbinato, usa l'opzione grep -o. Probabilmente avrai anche bisogno di usare sed per rimuovere il nome = parte del pattern.

grep -o 'name=[0-9a-zA-Z ]' myfile | sed /^name=/d 
+4

Due processi di questo è eccessivo. Se devi usare sed, puoi farlo con quello solo. –

4

grep non viene estratto come previsto. Quello che vi serve è

grep "name=" file.txt | cut -d'=' -f1- 
21

Prova questo:

sed -n 's/^name=//p' filename 

E 'indica a sed di stampare nulla (-n) per impostazione predefinita, sostituire il prefisso con niente, e stampare, se si verifica la sostituzione.

Bonus: se si ha realmente bisogno per abbinare solo voci con solo spazi e caratteri alfanumerici, si può fare anche questo:

sed -n 's/^name=\([ 0-9a-zA-Z]*$\)/\1/p' filename 

Qui abbiamo aggiunto un modello per abbinare gli spazi e caratteri alfanumerici solo fino alla fine della linea ($), e se corrispondiamo sostituiamo il gruppo tra parentesi e stampiamo.

+0

+1. Semplice, elegante, performante. –

+1

Molto probabilmente una soluzione molto adatta, ma il richiedente ha chiesto informazioni su grep ... e non corrisponde solo a spazi e caratteri alfanumerici. – markets

+1

La corrispondenza di soli spazi e alpha è banale, aggiungerò qualcosa per quello. Per quanto riguarda solo l'uso di grep, beh, la risposta top-ranked adesso usa grep AND sed ... almeno questo usa solo un singolo processo. :) –

3

gawk

echo "name=some value here" | awk -F"=" '/name=/ { print $2}' 

o con bash

str="name=some value here" 
IFS="=" 
set -- $str 
echo $1  
unset IFS 

o

str="name=some value here" 
str=${str/name=/} 
Problemi correlati