[AWK | SED] Insert sioux

Insert sioux [AWK | SED] - Shell/Batch - Programmation

Marsh Posté le 10-09-2004 à 18:44:33    

Bonjour,
 
C'est mon premier post dans la section script, donc bonjour à ceux qui me connaissent pas :hello:  
 
Bon entrons dans le vif du sujet... Pour un portage UNIX -> Linux, j'ai besoin de :
 
Ajouter un espace à chaque fin de ligne
 
Avec la contrainte suivante :
 

Code :
  1. toto\
  2. tata


 
doit être considéré comme 2 lignes, on devrait donc récupérer :
 

Code :
  1. toto\_
  2. tata_


 
Où "_" représente " "
 
Pour les curieux, le vieux cpp disponible sur les vieux SUN n'intérprète pas le "\" en fin de ligne comme une indication que la ligne continue. Et ça nous arrange, car le "\" est un symbole du langage. Ne me dites pas "BOUH C'EST PAS BIEN", je le sais, mais ce langage existe depuis les années 80 :)
Et donc en portant le compilateur sous Linux, la ligne est fusionné avec la ligne du dessous, et le symbole "\" disparait :(  
 
Merci pour votre aide :hello:


Message édité par Predicator le 10-09-2004 à 18:45:39
Reply

Marsh Posté le 10-09-2004 à 18:44:33   

Reply

Marsh Posté le 10-09-2004 à 18:48:18    

je comprends pas, si tu fais un portage Solaris -> Linux, où est le problème ?

Reply

Marsh Posté le 10-09-2004 à 18:57:05    

Le problème est que si tu fournis ce code à cpp :
 

Code :
  1. int toto \
  2. = 4;


 
en sortie, tu auras
 

Code :
  1. int toto = 4;


 
dans le cas du C/C++, ça ne pose pas de problème, dans le cas du langage que je dois compiler, ça pose problème, car "\" est un mot clé, et s'il disparait du fichier, bah ça ne marche plus !
 
cpp sous SUN4 ne mange pas les fin de ligne précédées de "\"...
 
Donc pour simplifier, ajouter " " à la fin de chaque ligne, même celles qui se terminent par "\" (toutes les lignes, car il y a un autre problème, mais pas besoin d'en parler)


Message édité par Predicator le 10-09-2004 à 18:58:21
Reply

Marsh Posté le 10-09-2004 à 19:10:12    

cpp : C Pre Processor
 
il fait ce qu'il doit faire. si tu l'utilise pour autre chose, tu t'exposes à de sacré problème.

Reply

Marsh Posté le 10-09-2004 à 19:23:34    

Taz a écrit :

cpp : C Pre Processor
 
il fait ce qu'il doit faire. si tu l'utilise pour autre chose, tu t'exposes à de sacré problème.


 
Tu es hors sujet là :o  
Mais je vois que tu es égal à toi même sur tous les forums dev, au moins je suis pas dépaysé :hello:  
cpp a changé de comportement entre 1988 et aujourd'hui, comment ils pouvaient prévoir que le \ deviendrait aussi important, hein ? :o  
 
Bon, ce n'est pas un sujet sur cpp, alors passons...
 
Quelqu'un a une idée pour générer ce fichier avec awk ou sed ? Je voudrais éviter PERL car ce n'est pas forcément dans les distrib de base :)


Message édité par Predicator le 10-09-2004 à 19:25:02
Reply

Marsh Posté le 10-09-2004 à 20:45:28    

perl pas dans une distrib de base ?

Reply

Marsh Posté le 10-09-2004 à 21:01:33    

Taz a écrit :

perl pas dans une distrib de base ?


 
+1
 
jai jamais rien vu qui avait pas perl
 
une LFS, une debian, AIX, solaris, ca l'a tjrs perl (et j'ai jamais vu en dessous de 5.05.02 => 5.5.2)

Reply

Marsh Posté le 10-09-2004 à 21:04:42    

bon admettons... on peut donc ajouter PERL à la liste des solutions possible... :)

Reply

Marsh Posté le 10-09-2004 à 21:15:48    


#!/usr/bin/perl
 
use strict;
 
my $file = '/tmp/file.cpp';
 
open(FENT, '< ' . $file);
my @lines = <FENT>;
close FENT:
 
open(FSOR, '> ' . $file);
foreach my $line (@lines) {
  if ($line =~ m/\n$/) {
    $line =~ s/\n/ \n/;
  }
  else {
    $line = $line . ' ';
  }
  print FSOR $line . ' ';
}
close FSOR;


 
pas testé mais devrait fonctionné
 
en gros tu veux seulement ajouter un espace après chaque ligne

Reply

Marsh Posté le 10-09-2004 à 22:25:50    

C'est nickel ! Merci beaucoup à toi :jap:  
Je vais voir si je peux pas adapter à sed avec une syntaxe équivalente pour la substitution, et si je trouve pas, ça marchera avec Perl :hello:

Reply

Marsh Posté le 10-09-2004 à 22:25:50   

Reply

Marsh Posté le 10-09-2004 à 22:27:47    

en gros burger t'as craché la solution toute prête ... et toi tu parles toujours de sed ... mais vas-y, on l'attend toujours ton code sed ...

Reply

Marsh Posté le 10-09-2004 à 22:31:55    

Taz a écrit :

en gros burger t'as craché la solution toute prête ... et toi tu parles toujours de sed ... mais vas-y, on l'attend toujours ton code sed ...


 
c'est son choix, on peut lui en vouloir de tenter le coup s'il préfère sed

Reply

Marsh Posté le 10-09-2004 à 22:38:11    

non, moi je lui reproche de faire un sujet hors charte, toi tu t'ennuies à lui faire son truc, et il te répond qu'il préfère sed ... mais on a pas vu une seule ligne de sed alors ...

Reply

Marsh Posté le 10-09-2004 à 22:40:49    

Taz a écrit :

en gros burger t'as craché la solution toute prête ... et toi tu parles toujours de sed ... mais vas-y, on l'attend toujours ton code sed ...


 
Je ne crache sur rien du tout :o  
J'ai remercié BurgerGold, mais effectivement, je préfèrerais avoir une ligne sed, même si c'est illisible, plutôt que d'avoir à appeler un script depuis un compilateur.
Et puis je ne pense pas avoir à recevoir de leçon de ta part... La moitié de tes posts dans la section dev ne servent à rien, tu détourne tous les posts, tu as été, comme souvent, d'une inutilité absolue ici... :o  
Mais on y peut rien, c'est la mentalité de beaucoup de développeurs ici. Heureusement qu'il reste des personnes compétentes ET pas imbues de leur personne... Merci encore BurgerGold :hello:

Reply

Marsh Posté le 10-09-2004 à 22:44:08    

Taz a écrit :

non, moi je lui reproche de faire un sujet hors charte


 
En quoi il est hors charte mon sujet ? :heink:  
 
Et puis toi, arrête de penser à la place des autres, tu ne connais pas les contraintes, mais tu crois pourtant tout savoir :o  
Je déteste sed, je le trouve ignoble, je préfère Perl (du moins à l'époque lointaine où j'avais fait 2-3 trucs avec, ça devait être... Non je préfère pas y penser :lol: ), mais si je veux l'utiliser c'est qu'il y a une raison :o


Message édité par Predicator le 10-09-2004 à 22:44:18
Reply

Marsh Posté le 10-09-2004 à 22:46:40    

il est hors charte dans le sens où tu demandes du code. on fait pas de résolution d'exercice ni de travail à l'oeil. si tu veux qu'on t'aide avec sed, on veut bien, mais faut que tu montres ou tu en es. sinon, RTFM

Reply

Marsh Posté le 10-09-2004 à 23:05:44    

En utilisant l'expression régulière de BurgerGold, j'arrive à avoir un fichier de sortie qui a la même fin de ligne qu'en entrée. Le \ avant la fin de ligne est donc correctement géré, mais il n'ajoute pas d'espace...
 

Code :
  1. sed 's/\n/ \n/' inputfile > outputfile


 
Apparemment il ne prend pas en compte l'espace dans la seconde chaîne de substitution. En en mettant plusieurs, le résultat est le même :(

Reply

Marsh Posté le 10-09-2004 à 23:08:55    

sed 's/$/ /g' | cat -A
a
b
c
a $
b $
c $

Reply

Marsh Posté le 10-09-2004 à 23:12:57    

Taz a écrit :

sed 's/$/ /g'


 
ça marche, merci beaucoup :jap:  
il me manquait le global, par contre je ne comprends pas pourquoi ça ne marche pas ainsi :
 
sed 's/$\n/ \n/g'
 
EDIT : quand j'y réfléchis c'est con de mettre l'\n dedans des 2 côtés :lol:  
 
Merci à vous deux


Message édité par Predicator le 10-09-2004 à 23:13:39
Reply

Marsh Posté le 10-09-2004 à 23:16:03    

parce que sed fonctionne en mode ligne et que la fin de ligne c'est $ et rien d'autre

Reply

Marsh Posté le 11-09-2004 à 05:56:18    

Taz a écrit :

non, moi je lui reproche de faire un sujet hors charte, toi tu t'ennuies à lui faire son truc, et il te répond qu'il préfère sed ... mais on a pas vu une seule ligne de sed alors ...


 
si je l'ai fait c'est parce que ca me faisait plaisir  ;)

Reply

Marsh Posté le 12-09-2004 à 03:05:50    

J'ai peut-être loupé un truc, mais je comprend pas vraiment pourquoi t'as besoin de tant de lignes pour faire ça en perl. « perl -i -pe 's/$/ /' » ça suffit, non ?


Message édité par matafan le 12-09-2004 à 03:07:47
Reply

Marsh Posté le 12-09-2004 à 06:55:00    

matafan a écrit :

J'ai peut-être loupé un truc, mais je comprend pas vraiment pourquoi t'as besoin de tant de lignes pour faire ça en perl. « perl -i -pe 's/$/ /' » ça suffit, non ?


 
possible, jai jamais vraiment utilisé perl en ligne de commande
 
moi je fais carrément du script, je fais la lecture, le remplacement lorsque ya un retour de ligne et lorsquien a pas, puis je réécris
 
si tu dis que ta méthode fonctionne, bin là c'est clair que se casser la tête avec sed ca sert à rien

Reply

Marsh Posté le 12-09-2004 à 15:57:42    

D'ailleurs c'est un aspect un peu méconnu de Perl mais ma ligne de commande marche aussi sur un fichier en faisant « perl -i -pe 's/$/ /' file_name ». En effet l'opérateur angle (<> ) fonctionne sur l'entrée par défaut, qui n'est pas forcément stdin. Si on donne un fichier en argument à Perl l'entrée par défaut est ce fichier.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed