2010-06-04 8 views
1

J'ai du mal à sélectionner un fichier à l'aide d'une expression régulière. J'essaye de remplacer un texte spécifique dans le dossier qui est plein de lignes comme ceci.Expression régulière avec sed

/home/user/test2/data/Train /train38.wav /home/user/test2/data/train/train38.mfc

Je suis en train de remplacer le texte en gras. Le problème est le je ne sais pas comment sélectionner seulement le texte en gras puisque j'ai besoin d'utiliser .wav dans mon expression rationnelle et le nom de fichier et l'emplacement du fichier sera également différent.

Espoir vous pouvez aider

Meilleures salutations, Jökull

+5

Peut-être pourriez-vous définir plus précisément les chaînes à remplacer. Est-ce la chaîne entre le 5ème et le 6ème/par exemple? Ou est-ce toujours le mot "train"? Ou est-ce le mot qui termine .wav, mais dans le segment avant où il se termine par .wav? –

Répondre

1

Cela suppose que ce que vous voulez remplacer est la chaîne entre les deux barres obliques dans le premier chemin.

sed 's|\([^/]*/\)[^/]*\(/[^/]* .*\)|\1FOO\2|' filename 

produit:

/home/user/test2/data/FOO/train38.wav /home/user/test2/data/train/train38.mfc 
0
sed 's;\(\(/[^/]\+\)*\)/train\(\(/[^/]\+\)*\)\.wav;\1/FOO\3.wav;' 
+0

Cela ne semble pas fonctionner - il ne change pas l'exemple d'entrée (au moins sur MacOS X 10.6.7). –

+0

sed ne modifie pas l'entrée, "sed" signifie "Stream EDitor" et les flux ne sont pas accessibles en écriture. La première chose que vous ferez est '' man sed '' et lisez comment fonctionne votre version spécifique, vous pouvez ou non avoir un moyen de modifier le fichier et si vous ne créez pas un fichier temporaire et remplacez l'original par il. –

+0

excuses pour être marginalement inexactes ... vous avez raison. J'aurais dû dire: si on lui donne l'exemple d'entrée, votre script sed ne produit aucun changement, donc la sortie est la même que l'entrée (au moins avec le MacOS X). Je peux modifier ce que vous avez écrit pour le faire fonctionner comme une regex étendue (ERE) comme ceci: 'sed -E 's; ((/ [^ /] +) *)/train ((/ [^ /] +) *) \. wav; \ 1/FOO \ 3.wav; '', où le changement principal est une réduction du nombre de barres obliques inverses.Étant donné que la question a 10 mois et que le questionneur original n'a pas clarifié la question, il sera difficile de savoir avec certitude ce qu'il voulait. –

1

lignes processus sed un à la fois, de sorte que vous pouvez omettre l'option globale et il ne changera le premier 'train' sur chaque ligne

sed 's/train/FOO/' testdat 

contre

sed 's/train/FOO/g' testdat 

qui est un remplacement global

C'est un peu plus lisible et moins sujette aux erreurs que certains des autres possibilités, mais bien sûr, il y a des applications qui ne simplifierait pas tout à fait aussi facilement.

0

Vous pouvez le faire comme ça

sed -e 's/\<train\>/plane/g' 

Le \< indique à Sed de correspondre au début de ce travail et le \> lui dit de correspondre à la fin du mot. Le g à la fin signifie global afin qu'il effectue la correspondance et remplace sur la ligne entière et ne s'arrête pas après la première correspondance réussie comme il le ferait normalement sans g.