2013-05-23 4 views
0

Si j'ai une ligne quelque chose comme ceci: 1300397,0,3,86,some more text here,end writing, another string here et je veux afficher 86 end writing seulement, comment puis-je faire cela en utilisant sed? Jusqu'à présent, j'ai ceci: sed 's/.*\(8[4-6]\).*/\1/' job_details.txt qui affiche seulement 86. Comment puis-je inclure end writing chaîne?Comment trouver des motifs dans une ligne et imprimer le résultat en utilisant UNIX sed?

Résultat souhaité: 86 end writing

Merci d'avance pour votre aide!

+0

Avec awk serait juste 'echo « 1300397,0,3,86, un peu plus de texte ici, fin d'écriture "| awk -F, '{print $ 4, $ 6}' ' – fedorqui

+0

@fedorqui si vous vérifiez ses codes sed, il ne sait pas que le 86 sera toujours en $ 4. – Kent

+0

Oui, vous avez raison @Kent. Quoi qu'il en soit on ne sait pas où et quelle condition nous devrions avoir à part ça en commençant par '8'. Peut-être un 'echo 86' ferait l'affaire :) – fedorqui

Répondre

2

cette ligne devrait fonctionner:

awk -F, '{for(x=1;x<=NF;x++)f=$x~/^8[4-6]$/?$x:f;print f,$NF}' 

note que, la ligne ci-dessus vérifie un champ/colonne si elle est égale à 8[4-6]. par exemple, 86 sera imprimé, mais 88886 or foo86bar or 8622222 ne sera pas imprimé. Si vous voulez juste vérifier si la colonne contient8[4-6], retirez le ^ and $ du one-liner.

avec votre exemple:

kent$ echo "1300397,0,3,86,some more text here,end writing"|awk -F, '{for(x=1;x<=NF;x++)f=$x~/^8[4-6]$/?$x:f;print f,$NF}' 
86 end writing 

EDIT

essayez ceci:

awk -F, '{for(x=1;x<=NF;x++){f=$x~/^8[4-6]$/?$x:f;e=e?e:$x=="end writing"}print f, (e?"end writing":"")}' 
+0

Salut Kent, merci pour la réponse rapide. Je n'ai pas encore essayé votre code mais on dirait qu'il va imprimer 86 et la dernière ligne qui est l'écriture de fin? Que se passe-t-il s'il y a plus de chaînes après la fin de l'écriture? Désolé je devrais avoir soulevé ceci ci-dessus. – Lyman

+2

s'il vous plaît mettre à jour votre question avec un meilleur exemple pls. votre exemple me permet de supposer que vous voulez prendre 86 et la dernière colonne. – Kent

+0

La question a été mise à jour Kent. Pouvez-vous vérifier à nouveau s'il vous plaît? – Lyman

0
sed -nr '/^.*(8[4-6]).*(end writing).*$/{s//\1 \2/;p}' job_details.txt 
Questions connexes