2012-03-30 14 views
2

hier ist das Skript, das ichRohrleitungen bash Eingabeargumente in egrep regulären Ausdruck

#!/bin/bash 

charlist=$1 #possible input:cat 
wordlength=$2 #possible input: 3 

cat ./nounlist | egrep \b[${charlist}]\b{${wordlength}} 

Ausgang zu laufen versuchen. Nichts # sollte die folgende (mit der Befehlszeile) habe gefangen

$ cat nounlist | egrep "\b[cat]{3}\b" 
act 
cat's_cradle 
cat 
cat-o'-nine-tails 
cat's-paw 
Sno-cat 
act 
act 
act 
act 
rat-a-tat-tat 
cat 
cat's-claw 
cat's_foot 
cat's-ear 
cat's-tail 
cat's-ear 
cat's_eye 

im Grunde versuche ich ein Skript zu schreiben, das zwei Argumente (Wortliste, Wortlänge) nimmt und alle Wörter in der Nomenliste abruft, die aus dem Zeichen in der Wortliste bestehen und die Länge der Wortlänge haben. Was ich wissen möchte, ist, wie man Bash-Variablen in den regulären Ausdruck von egrep als Strings einfügt.

Danke!

Antwort

3

Sie müssen das Argument in doppelte Anführungszeichen wickeln, so dass Bash nicht versucht, die Schrägstriche, zu handhaben und die zweite \b-nach bewegen die {${wordlength}}:

cat ./nounlist | egrep "\b[${charlist}]{${wordlength}}\b" 

(Wenn Sie laufen echo \b Sie werden sehen, dass es nur b druckt, weil Bash davon ausgeht, dass \ da ist, um zu verhindern, dass b irgendeine besondere Bedeutung hat, also entfernt es es.)

+0

Vielen Dank für Ihre Antwort! nur aus Neugier, haben Bash-Variablen Vorrang für alle Programme in der Bash-Skript? Mit anderen Worten, wie stellen Sie sicher, dass $ {variable} Bash-Variable ist? und was ist mit dem umgekehrten? sagen Sie haben $ 1 im regulären Ausdruck für sed im Bash-Skript? Ich war schon immer neugierig darauf. – Alby

+1

@Alby: Bash wird '$ {variable}' expandieren, wenn es überhaupt nicht zitiert wird (zB 'echo $ {variable}') oder wenn es nur in doppelten Anführungszeichen steht (zB 'echo "$ {variable}" '). Es wird * nicht * expandieren '$ {variable}', wenn es durch einen umgekehrten Schrägstrich (zB 'echo \ $ {variable}' oder 'echo" \ $ {variable} "') oder durch einfache Anführungszeichen (zB 'echo ' $ {variable} ''). Aus diesen und verwandten Gründen, wenn Sie ein "sed" one-liner - oder "awk" one-liner oder 'perl' one-liner schreiben oder was auch immer - möchten Sie es normalerweise in einfache Anführungszeichen verpacken, um minimieren Bashs Interferenz damit. – ruakh