2010-03-12 12 views
0

file.txt contient:aide grep [[: alpha:]] * -o

##w## 

##wew## 

utilisant mac 10.6, bash, la commande:

cat file.txt | grep [[:alpha:]]* -o

rien sorties. J'essaie d'extraire le texte à l'intérieur des signes de hachage. Qu'est-ce que je fais mal?

+1

utilisation obsolète de 'cat' – Vijay

Répondre

2

(Notez qu'il est préférable de la pratique dans ce cas pour passer le nom de fichier comme argument pour grep au lieu de redirigeant la sortie du chat à grep. grep PATTERN file au lieu de cat file | grep PATTERN)

Quelle coquille utilisez-vous pour exécuter cette commande? Je soupçonne que votre problème est que le shell interprète l'astérisque comme un caractère générique et essaie de regrouper les fichiers.

Essayez d'indiquer votre motif, par ex. grep '[[:alpha:]]*' -o file.txt.

J'ai remarqué que cela fonctionne bien avec la version de grep qui est sur ma machine Linux, mais le grep sur mon Mac nécessite la commande grep -E '[[:alpha:]]+' -o file.txt.

+0

déjà fait, pas de chance. les guillemets doubles ne le résolvent pas non plus. ni '[[: alpha:]] '*' (en ne plaçant que le champ [[: alpha:]] entre guillemets) – anoda9

+0

Il est intéressant de noter que cette solution fonctionne correctement sur une de mes machines Linux, mais pas sur Mac. Sur le Mac cela fonctionne bien si j'utilise l'option -E et + au lieu de *: grep -E '[[: alpha:]] +' -o. – RTBarnard

+0

En outre, vous devriez noter que dans bash, un '*' entre guillemets causera toujours la globalisation. Les guillemets simples indiquent au shell de ne pas interpréter le contenu de la citation. Vous voudrez donc que votre RE soit imbriqué dans des guillemets simples. – RTBarnard

1
sed 's/#//g' file.txt 

/SCRIPTS [31]> cat file.txt 
##w## 
##wew## 

/SCRIPTS [32]> sed 's/#//g' file.txt 
w 
wew 
+0

ouais, j'ai pensé à ça, mais ça m'a ennuyé que la façon de grep ne fonctionne pas. – anoda9

+0

Pour cette application, grep est probablement un meilleur choix que sed car ses performances seront sensiblement meilleures. Les discussions sur les performances sed/grep abondent sur le web, mais dans un test informel, j'ai exécuté 500 itérations en utilisant sed et 500 en utilisant grep. Exécution de ce test 10 fois, sed en moyenne ~ 2.2s pour terminer, tandis que grep en moyenne ~ 1.5s pour terminer. – RTBarnard

0

si vous avez bash> 3,1

while read -r line 
do 
    case "$line" in 
    *"#"*) 
     if [[ $line =~ "^#+(.*)##+$" ]];then 
      echo ${BASH_REMATCH[1]} 
     fi 
    esac  
done <"file"