2011-03-16 14 views
7

Ho bisogno di egrep una stringa che non è nota prima del runtime e che otterrò tramite variabile di shell (la shell è bash, se questo è importante). Il problema è che quella stringa conterrà caratteri speciali come bretelle, spazi, punti, barre e così via.Come sfuggire a una stringa precedentemente sconosciuta nell'espressione regolare?

Se conosco la stringa, posso sfuggire ai caratteri speciali uno alla volta, ma come posso farlo per l'intera stringa?

L'esecuzione della stringa attraverso uno script sed per il prefisso di ogni carattere speciale con \ potrebbe essere un'idea, ho ancora bisogno di rtfm come dovrebbe essere scritto uno script di questo tipo. Non so se ci sono altre, migliori opzioni.

ho letto re_format(7) ma sembra non v'è nulla di simile come "prendere tutta la successiva stringa come letterale" ...

EDIT: per evitare falsi positivi, vorrei anche aggiungere il rilevamento di nuova riga al modello, per esempio. egrep '^myunknownstring'

+0

come evitare le espressioni regolari in bash http://stackoverflow.com/questions/11856054/bash-easy-way-to-pass-a-raw-string-to-grep/16951928#16951928 –

risposta

7

Se avete bisogno di inserire la stringa in un'espressione complessa, sed è come lo farei.

s_esc="$(echo "$s" | sed 's/[^-A-Za-z0-9_]/\\&/g')" # backslash special characters 
inv_ent="$(egrep "^item [0-9]+ desc $s_esc loc .+$" inventory_list)" 
+0

Prova 'sed 's/[^ [: alnum:] _-]/\\ &/g'' perché la tua versione non funziona su tutte le versioni locali – SiegeX

+0

' s_esc = $ (echo "$ s" | sed' s/[] \\. $ * {} | +?() Anche [^ -]/\\ &/g ') 'dovrebbe funzionare. – skozin

4

utilizzare il flag -F per rendere il modello di una stringa letterale fisso

$ var="(.*+[a-z]){3}" 
$ echo 'foo bar (.*+[a-z]){3} baz' | grep -F "$var" -o 
(.*+[a-z]){3} 
+0

grazie per il suggerimento , è corretto, ma ho dimenticato di specificare che devo anche abbinare la stringa _only_ all'inizio della riga. Ho aggiunto questo dettaglio alla domanda. – Luke404

0

Si sta tentando di proteggere la stringa da essere erroneamente interpretato come sintassi bash o stai cercando di proteggere le parti della stringa di essere interpretato come sintassi delle espressioni regolari?

Per la protezione bash:

grep supporta l'interruttore -f:

-f FILE, --file=FILE 
    Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. 

sfuggire è necessario all'interno del file. Basta renderlo un file contenente una singola riga (e quindi un pattern) che può essere prodotto dalla variabile della shell, se è quello che devi fare.

# example trivial regex 
var='^r[^{]*$' 
pattern=/tmp/pattern.$$ 
rm -f "$pattern" 
echo "$var" > "$pattern" 
egrep -f "$pattern" /etc/password 
rm -f "$pattern" 

Giusto per illustrare il punto.

Provalo con -F invece come un altro poster suggerito per la protezione da regex.

Problemi correlati