Remplacer plusieurs lignes par un seul ";" dans un fichier

Remplacer plusieurs lignes par un seul ";" dans un fichier - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 11-06-2013 à 20:26:54    

Bonsoir,
 
J'ai un fichier qui ressemble à ca:  
 

Code :
  1. DROP INDEX SwCatDeviceLicenses_Suite ON ampdbuser.SwCatDeviceLicenses;
  2. DROP INDEX AppListSwCatAss_AppList ON ampdbuser.AppListSwCatAssignments;
  3. DROP INDEX LicensedSwCatAss_LAppID ON ampdbuser.LicensedSwCatAssignments;
  4. DROP INDEX SQLS_IDX_ADMGRPXR_1 ON ampdbuser.AdminGroupAssignedRights
  5. (
  6.     ObjectTypeID ASC,
  7.     AdminGroupID ASC,
  8.     ObjectID ASC,
  9.     ReadAccess ASC
  10. ) ON ampdbuser."AMP_INDEX";


Je dois bien évidemment supprimer

Code :
  1. (
  2.     ObjectTypeID ASC,
  3.     AdminGroupID ASC,
  4.     ObjectID ASC,
  5.     ReadAccess ASC
  6. ) ON ampdbuser."AMP_INDEX";


et le remplacer par

Code :
  1. ;

si possible à la ligne d'avant, sinon ca n'est pas important.
 
J'ai cherché comment faire avec sed, awk mais je ne trouve que des commandes qui vont supprimer "x" lignes après ou qui vont chercher la même lignes sur plusieurs lignes etc...
 
Je suis quand même tombé sur cette page qui est assez complète mais ne répond pas a mon besoin, et bien d'autres....
 
Quelqu'un aurait-il une idée?

Reply

Marsh Posté le 11-06-2013 à 20:26:54   

Reply

Marsh Posté le 12-06-2013 à 10:40:39    

Une solution simple, c'est si tu es sur que les lignes de drop sont toujours sur une seule ligne.
Si c'est le cas, tu peux filtrer directement le fichier sur les lignes commençant par drop, puis une fois fait, toutes les lignes ne terminant pas par un ; tu en ajoutes un.
 
En gros :

Code :
  1. grep "^[ ^I]*DROP" fichier | sed 's/[^;][ ^I]*$/;/'


 
( ^I = tabulation )
 
Mais bon, comme dit, il faut que tu soit sur de ton fichier en entrée, si un drop est sur deux lignes c'est foutu.
 
Si tu n'es pas sur du fichier, à part le parser ligne à ligne, je ne vois pas de solutions

Reply

Marsh Posté le 15-06-2013 à 14:29:36    

# http://stackoverflow.com/questions [...] ern-in-sed
# sed -e '/begin/,/end/{s/begin/replacement/p;d}'
 

Code :
  1. cat temp.txt
  2. DROP INDEX SwCatDeviceLicenses_Suite ON ampdbuser.SwCatDeviceLicenses;
  3. DROP INDEX AppListSwCatAss_AppList ON ampdbuser.AppListSwCatAssignments;
  4. DROP INDEX LicensedSwCatAss_LAppID ON ampdbuser.LicensedSwCatAssignments;
  5. DROP INDEX SQLS_IDX_ADMGRPXR_1 ON ampdbuser.AdminGroupAssignedRights
  6. (
  7.     ObjectTypeID ASC,
  8.     AdminGroupID ASC,
  9.     ObjectID ASC,
  10.     ReadAccess ASC
  11. ) ON ampdbuser."AMP_INDEX";


 

Code :
  1. sed  -i '/(/,/)/{s/(/;/p;d}' temp.txt


Code :
  1. cat temp.txt
  2. DROP INDEX SwCatDeviceLicenses_Suite ON ampdbuser.SwCatDeviceLicenses;
  3. DROP INDEX AppListSwCatAss_AppList ON ampdbuser.AppListSwCatAssignments;
  4. DROP INDEX LicensedSwCatAss_LAppID ON ampdbuser.LicensedSwCatAssignments;
  5. DROP INDEX SQLS_IDX_ADMGRPXR_1 ON ampdbuser.AdminGroupAssignedRights
  6. ;


Message édité par roondar le 15-06-2013 à 14:33:18
Reply

Marsh Posté le 18-08-2013 à 17:56:31    

Salut,
 
"sed" a la possibilité d'ajouter (a), d'insérer (i) ou de changer (c) du texte juste avec une de ces 3 lettres.
Par contre seule la commande "c" (change) admet une plage d'adresses.
 

Code :
  1. cat brol


DROP INDEX SwCatDeviceLicenses_Suite ON ampdbuser.SwCatDeviceLicenses;
DROP INDEX AppListSwCatAss_AppList ON ampdbuser.AppListSwCatAssignments;
DROP INDEX LicensedSwCatAss_LAppID ON ampdbuser.LicensedSwCatAssignments;
DROP INDEX SQLS_IDX_ADMGRPXR_1 ON ampdbuser.AdminGroupAssignedRights
(
ObjectTypeID ASC,
AdminGroupID ASC,
ObjectID ASC,
ReadAccess ASC
) ON ampdbuser."AMP_INDEX";


Code :
  1. $ sed '/(/,/)/c;' brol


DROP INDEX SwCatDeviceLicenses_Suite ON ampdbuser.SwCatDeviceLicenses;
DROP INDEX AppListSwCatAss_AppList ON ampdbuser.AppListSwCatAssignments;
DROP INDEX LicensedSwCatAss_LAppID ON ampdbuser.LicensedSwCatAssignments;
DROP INDEX SQLS_IDX_ADMGRPXR_1 ON ampdbuser.AdminGroupAssignedRights
;


 ;)


---------------
$ man woman
Reply

Sujets relatifs:

Leave a Replay

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