2010-09-16 8 views
0

Vraiment apprécierait aide sur ce point. J'utilise sed pour créer un fichier CSV. Essentiellement, les fichiers html multiples sont tous fusionnés en un seul fichier html et sed est ensuite utilisé pour supprimer toutes les images indésirables etc. pour accéder aux données colonnaires brutes.Très basique de remplacement en utilisant sed

J'ai tout cela fonctionne mais je suis coincé sur le dernier bit.

Ce que je veux faire est très basique - Je veux remplacer les lignes suivantes:

"a variable string" 
"end td" 
"begin td" 

avec une seule ligne:

"a variable string" 

(avec un caractère de tabulation à la fin de cette ligne)

J'utilise DOS.

Comme vous le voyez, je suis nouveau dans tout cela. Si je pouvais obtenir ce travail me permettrait de gagner beaucoup de temps à l'avenir, donc j'apprécierais l'aide. Pour le moment, je dois réinjecter certains en-têtes html dans le fichier texte, l'ouvrir dans un éditeur html, sélectionner la table, puis la coller dans une feuille de calcul ce qui est un peu douloureux.

P.S. Y at-il un moyen facile d'obtenir sed pour enlever les parenthèses '(' et ')' d'une ligne donnée?

+2

DOS? T'es en colère? (Il ya sed pour DOS?) –

+0

oui: http://gnuwin32.sourceforge.net/packages/sed.htm sed m'a permis de tirer des sections de texte sur le fichier HTML, puis vider dans un nouveau fichier – Rhys

+0

I soupçonne que ce n'est pas DOS, mais c'est le shell CMD dans Windows. –

Répondre

1

Je doute que c'est ce que vous voulez vraiment, mais c'est ce que vous avez demandé.

sed "s/\"a variable string\"/&\t/; s/\"end td\"//; s/\"begin td\"//" inputfile 

Ce que vous voulez probablement faire est de les remplacer quand ils apparaissent consécutivement. Voici comment vous pouvez faire:

sed "1{N;N}; /\"a variable string\"\n\"end td\"\n\"begin td\"/ s/\n.*$/\t/;ta;bb;:a;N;N;:b;$!P;N;D" inputfile 

Cela supprimera tous les parenthèses dans un fichier:

sed "s/[()]//g" inputfile 

Pour sélectionner des lignes particulières, vous pouvez faire quelque chose comme ceci:

sed "/foo/ s/[()]//g" inputfile 

qui ne fera le remplacement que si le mot "foo" est quelque part sur une ligne.

Édition: Modification de guillemets simples à des guillemets doubles pour accueillir GNUWin32 et CMD.EXE.

+0

cmd.exe déteste les guillemets simples. 'sed" ... "file' – ghostdog74

+1

@ user229426: J'ai juste essayé Cygwin' sed' à partir d'une invite 'CMD' et cela a très bien fonctionné avec des guillemets simples. Quand je l'ai essayé avec GNUWin32 'sed' j'ai eu une erreur en me plaignant des guillemets simples. Je vais modifier ma réponse. –

+0

Wow - merci de prendre tout le temps de répondre. – Rhys

0

Un commentaire précédent je suis parti ne semble pas avoir été sauvé - alors réessaiera

Le code pour supprimer le (et) a parfaitement fonctionné grâce

Vous avez raison - je cherchais à fusionner les 3 lignes en une ligne, donc le deuxième exemple que vous avez donné où il semble que sa lecture des deux lignes suivantes dans l'espace de modèle semble plus prometteur. La sortie n'était pas ce que je m'attendais cependant. Je réalise maintenant que le code va être plus compliqué et je ne veux plus vous déranger comme ma méthode manuelle d'injecter du code html dans le fichier texte et l'ouvrir dans Openoffice et coller dans une feuille de calcul ne prend que quelques secondes et j'ai le sentiment de produire manuellement le codage sed à ce serait un cauchemar.

Essentiellement, les règles de conversion du html auraient besoin d'être: [chaque balise a été formaté de sorte qu'il apparaît sur sa propre ligne] Je donne par exemple d'un fichier d'entrée et souhaité fichier de sortie ci-dessous pour référence

1) si < tr> est suivi de < td> sur la ligne suivante, supprimez complètement les lignes < tr> et < td> [c.-à-d. ne pas sortir un retour chariot] et sur la ligne NEXT coller un "au début de cette ligne [peu importe le retour chariot à la fin de cette ligne car il va être édité plus tard]

2) si </td> est suivi de < td> supprimer complètement ces deux lignes [ne pas retourner un retour chariot après ces lignes] et sur la sortie ligne précédente a ", [ne pas afficher un retour chariot] et sur le bâton de ligne NEXT « au début de la ligne [ne vous inquiétez pas le retour chariot de fin est sera édité plus tard]

3) si </td> est suivi par </tr> supprimer ces deux lignes et sur la ligne précédente ajouter un "à la fin de la ligne et un final c retour d'arriage.

J'ai donné un exemple de ce que l'entrée et la sortie désirée serait:

entrée: http://medinfo.redirectme.net/input.txt

[le fichier désiré sera affiché dans le message suivant - cette carte ne permettra pas de nouveaux utilisateurs à poster un message avec plus d'un lien hypertexte!]

Il y a un problème supplémentaire que la colonne d'adresse est sur plusieurs lignes sur le fichier d'entrée - cela pourrait être réduit à une ligne en cherchant à voir si le premier caractère de la prochaine line est un "Si ce n'est pas le cas, ne pas afficher le retour chariot à la fin du li courant ne

Ouf qui était un cauchemar juste pour taper out effectivement le code. Mais merci encore pour toute votre aide pour aller aussi loin! :-)