2010-06-22 3 views
0

Je suis en train d'utiliser sed pour supprimer des parties d'un fichier texte avec des lignes comme:Question sur sed command?

23920 ES: 1 R: 2 C: 14 L: 5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587

23921 ES: 1 R: 2 C: 14 L: 6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692

les parties I nécessité de supprimer les parties sont comme E S:1 R:2 C:14 L:5 ch 80 et dans E S:1 R:2 C:14 L:6 ch 1 chaque ligne. Les chiffres changent tout le fichier, mais sont toujours entre 1 et 100.

+0

Est-ce toujours les mêmes 7 champs que vous devez supprimer? –

+0

@Jed: bon point, et si la réponse est oui, 'awk' peut être un meilleur outil (ou au moins plus optimisé) pour le travail. –

Répondre

2

Vous pouvez également utiliser cut pour cela, si elle toujours les mêmes champs:

[email protected]:~$ echo "23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587 
23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692" | cut -d" " -f1,8- 
23920 80 7279 1113 5272 -342 1168 5642 -347 1265 5587 
23921 1 4605 1267 4586 11 1331 4587 -31 1306 4692 

EDIT: Explication de la commande de coupe utilisée:

-d" " Utilisez l'espace comme séparateur

-f 1,8- champ Retour 1, champ 8, et tous les champs après 8

1

Une solution sed

linux-t77m:$ more st.txt 
23920 E S:1 R:2 C:14 L:5 ch 80 7279 1113 5272 -342 1168 5642 -347 1265 5587 

23921 E S:1 R:2 C:14 L:6 ch 1 4605 1267 4586 11 1331 4587 -31 1306 4692 

linux-t77m:$ sed -r "s/E S:.* ch [0-9]+ //g" st.txt 
23920 7279 1113 5272 -342 1168 5642 -347 1265 5587 

23921 4605 1267 4586 11 1331 4587 -31 1306 4692 

Cela se fait avec une substitution d'expression régulière. La commande s/< regexp>/< substitution>/g remplace chaque partie de chaque ligne correspondant < regexp> pour la substitution <>.

Dans ce cas < regexp> est E S:.* ch [0-9]+ ce qui signifie:

  1. recherche ES:
  2. Seach puis pour tout jusqu'à ce que vous voyez
  3. un espace précédent ch suivi d'un espace, un ou plusieurs chiffres et un autre espace

Et < substitution> est la chaîne vide, de sorte qu'il supprime efficacement les parties des lignes correspondant il. L'option -r signale que nous utilisons des expressions régulières 'étendues', qui sont généralement plus claires car elles n'ont pas besoin d'autant de barres obliques inverses que celles requises par les expressions rationnelles standard.

+0

Pouvez-vous expliquer ce que fait chaque partie de la commande sed ci-dessus? De cette façon, nous pouvons tous apprendre au lieu de compter sur des maîtres sed comme vous pour chaque variation. Je dois admettre que j'étais coupable de ne pas avoir expliqué ma commande de coupe, alors j'ai édité et ajouté l'explication, mais sed est beaucoup plus compliqué. –

+0

@Jed: Voilà –

+0

@VinkoVrsalovic, notez que l'option '-r' est un GNU sed ism, et n'est ni standard ni universel. Une meilleure approche moderne serait l'option '-E', mais même cela n'est pas universel. La meilleure approche serait d'utiliser BRE, qui fonctionnera dans toutes les versions de sed. – ghoti