2013-08-15 2 views
-1

J'ai un fichier contenant des lignes de chaînes comme ceci:linux: lignes d'impression dont le premier mot correspond à une variable contenant des caractères spéciaux

uh-g+n uh-g+b 
uh-g g 
uh-g+r 
g+n 
uh-g+s g 
sh-n+b 
sh-n+d 
n+d sh-n+d 
g-n+d sh-n+d 

J'ai une liste de chaînes que je recherche, comme

set pats = (g + n sh-n + b n + d)

Pour chaque chaîne, je souhaite trouver la ligne dont le premier "mot" correspond à la chaîne et ajouter cette ligne à un autre fichier.

Comme vous pouvez le voir ...

  • Les chaînes de match sont des variables

  • Les chaînes peuvent ou peuvent ne pas contenir des caractères spéciaux de premier plan comme "-"

  • Les lignes peuvent contenir la chaîne comme un premier de deux mots, ou isolément

  • La chaîne peut être une sous-chaîne d'un long string er contenant des caractères principaux spéciaux

  • La chaîne peut le deuxième mot ou une partie du deuxième mot (qui ne devrait pas être un match)

Il a été un défi inattendu de trouver la bonne combinaison de choses à faire avec grep pour faire ce travail! .

Voici un exemple de quelque chose de simple pour essayer cela ne fonctionne pas (en supposant des lignes énumérées ci-dessus sont dans le fichier in.txt

#!/bin/tcsh 

set pats = (g+n sh-n+b n+d) 

foreach pat ($pats) 

    grep -w $pat in.txt >> out.txt 

end 

Dans ce cas, out.txt ressemble à ceci:

uh-g+n uh-g+b 
g+n 
sh-n+b 
sh-n+d 
n+d sh-n+d 
g-n+d sh-n+d 
uh-g+n uh-g+b 
g+n 
sh-n+b 
sh-n+d 
n+d sh-n+d 
g-n+d sh-n+d 

Mais ce que je veux est ceci:

g+n 
sh-n+b 
n+d sh-n+d 
+3

Salut, bienvenue à Stack Overflow! Quand une question demande du code, nous nous attendons à ce qu'elle inclue des solutions essayées, pourquoi elles n'ont pas fonctionné et quels résultats vous vouliez plutôt. (Voir [http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist](http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist].) Plus spécifiquement à votre question, je demanderais aussi une balise plus spécifique que "shell", puisque votre notation pour la définition d'une liste de chaînes ne correspond pas à celle des shell Linux courants. – ruakh

+0

Il semble que vous ayez plus d'un motif que vous souhaitez utiliser. Qu'est-ce que vous essayez exactement de faire correspondre. Voulez-vous faire correspondre chaque motif séparément?Un exemple du résultat souhaité aidera à faire passer votre message. Veuillez également décrire les approches que vous avez déjà essayées (par exemple, les commutateurs grep et les guillemets). –

Répondre

1

le pipeline suivant donne le résultat attendu:La première partie sort simplement les motifs, chacun sur sa ligne et précédé de ^. Grep recherche alors les motifs, le ^ les fait correspondre au début des lignes.

Mise à jour: La balise a été remplacée par tcsh. Aie. Ceci est une solution bash.

+0

Merci beaucoup - j'ai appris quelque chose de votre exemple. Je ne connaissais pas IFS. –

Questions connexes