J'ai essayé sed et awk, mais ça ne marche pas car le personnage implique "/" qui est déjà là en commande comme délimiteur.
Veuillez me faire savoir comment y parvenir.
Voici un exemple. Nous souhaitons supprimer les sections commentées, c.-à-d. /*.....*/
/*This is to print the output
data*/
proc print data=sashelp.cars;
run;
/*Creating dataset*/
data abc;
set xyz;
run;
text-processing
Sharique Alam
la source
la source
INSERT INTO string_table VALUES('/*'), ('*/'), ('/**/');
)Réponses:
Je pense que j'ai trouvé une solution facile!
QUELQUES MISES À JOUR:
Citation de l'utilisateur ilkachu (texte original des commentaires des utilisateurs):
J'ai joué un peu avec les options de gcc: -fpreprocessed désactivera la plupart des directives et extensions de macro (sauf #define et #undef apparemment). L'ajout de -dD laissera également les définitions dans; et std = c89 peut être utilisé pour ignorer le nouveau style // commentaires. Même avec eux, cpp remplace les commentaires par des espaces (au lieu de les supprimer) et réduit les espaces et les lignes vides.
Mais je pense que c'est toujours raisonnable et une solution facile pour la plupart des cas, si vous désactivez l'expansion des macros et d'autres choses, je pense que vous obtiendrez de bons résultats ... - et oui, vous pouvez combiner cela avec un script shell pour aller mieux ... et beaucoup plus...
la source
cpp
fera bien plus que supprimer des commentaires (traiter#include
, développer des macros, y compris celles intégrées ...)tail -n +7
supprimera simplement les 7 premières lignes, cela n'empêchera pas le#include
traitement ou les extensions de macro. Essayezecho __LINE__ | cpp
par exemple. Ouecho '#include /dev/zero' | cpp
-P
mode si vous le faites. (Cela peut éliminer la nécessité d'utilisertail
.)-fpreprocessed
désactivera la plupart des directives et extensions de macro (sauf#define
et#undef
apparemment). L'ajout-dD
laissera des définitions aussi; etstd=c89
peut être utilisé pour ignorer les nouveaux//
commentaires de style . Même avec eux,cpp
remplace les commentaires par des espaces (au lieu de les supprimer) et réduit les espaces et les lignes vides.Une fois, je suis venu avec ce que nous pouvons affiner:
pour gérer quelques autres cas d'angle.
Notez que si vous supprimez un commentaire, vous pouvez changer la signification du code (
1-/* comment */-1
est analysé comme1 - -1
while1--1
(que vous obtiendriez si vous supprimiez le commentaire) vous donnerait une erreur). Il est préférable de remplacer le commentaire par un caractère espace (comme nous le faisons ici) au lieu de le supprimer complètement.Ce qui précède devrait fonctionner correctement sur ce code C ANSI valide par exemple qui essaie d'inclure quelques cas d'angle:
Ce qui donne cette sortie:
Les deux affichent la même sortie une fois compilés et exécutés.
Vous pouvez comparer avec la sortie de
gcc -ansi -E
pour voir ce que ferait le pré-processeur. Ce code est également un code C99 ou C11 valide, maisgcc
désactive la prise en charge des trigraphes par défaut, de sorte qu'il ne fonctionnera pasgcc
sauf si vous spécifiez la norme commegcc -std=c99
ougcc -std=c11
ou ajoutez l'-trigraphs
option).Il fonctionne également sur ce code C99 / C11 (non-ANSI / C90):
(comparer avec
gcc -E
/gcc -std=c99 -E
/gcc -std=c11 -E
)ANSI C n'a pas soutenu le
// form
commentaire.//
n'est pas par ailleurs valide dans ANSI C, donc n'y apparaîtrait pas. Un cas artificiel où//
peut véritablement apparaître dans ANSI C (comme indiqué ici , et vous pouvez trouver le reste de la discussion intéressant) est lorsque l' opérateur stringify est utilisé.Il s'agit d'un code ANSI C valide:
Et au moment de la discussion en 2004,
gcc -ansi -E
il a effectivement été étendu à"//not a comment"
. Cependant aujourd'hui,gcc-5.4
renvoie une erreur dessus, donc je doute que nous trouvions beaucoup de code C en utilisant ce type de construction.L'
sed
équivalent GNU pourrait être quelque chose comme:Si votre GNU
sed
est trop ancien pour supporter-E
ou-z
, vous pouvez remplacer la première ligne par:la source
gcc -std=c11 -E -P
(-ansi
c'est juste un autre nom pour-std=c90
).??'
), donc nous comparons aveccpp -ansi
celles-ci et C99 / C11 ... une (comme// xxx
), donc nous comparons aveccpp
(oucpp -std=c11
...)avec
sed
:MISE À JOUR
prise en charge de tous les possibles (commentaire sur plusieurs lignes, données après [ou et] avant);
courir:la source
proc print data 2nd /*another comment is here*/
Supprimez les lignes vides, le cas échéant:
Edit - la version courte de Stéphane:
la source
-0777
comme une façon plus courte de faireBEGIN{$/=undef}
.*?
qu'au lieu de.+?
si/**/
est un commentaire valide aussi.Solution en utilisant la commande SED et aucun script
Vous voilà:
sed 's/\*\//\n&/g' test | sed '/\/\*/,/\*\//d'
NB Cela ne fonctionne pas sur OS X, sauf si vous installez
gnu-sed
. Mais cela fonctionne sur Linux Distros.la source
-i
option pour modifier le fichier sur place au lieu de rediriger la sortie vers un nouveau fichier. ou bien plus sûr-i.bak
de sauvegarder un fichiersed
fonctionne sur une seule ligne à la fois, mais certains des commentaires de l'entrée s'étendent sur plusieurs lignes. Selon /unix//a/152389/90751 , vous pouvez d'abord utilisertr
pour transformer les sauts de ligne en un autre caractère. Voussed
pouvez ensuite traiter l'entrée comme une seule ligne, et vous utilisez àtr
nouveau pour restaurer les sauts de ligne.J'ai utilisé des octets nuls, mais vous pouvez choisir n'importe quel caractère qui n'apparaît pas dans votre fichier d'entrée.
*
a une signification particulière dans les expressions régulières, il devra donc s'échapper\*
pour correspondre à un littéral*
..*
est gourmand - il correspondra au texte le plus long possible, y compris plus*/
et/*
. Cela signifie le premier commentaire, le dernier commentaire et tout le reste. Pour restreindre cela, remplacez-le.*
par un modèle plus strict: les commentaires peuvent contenir tout ce qui n'est pas un "*", et aussi "*" suivi de tout ce qui n'est pas un "/". Les séries de plusieurs*
s doivent également être prises en compte:Cela supprimera tous les sauts de ligne dans les commentaires multilignes, c'est-à-dire.
va devenir
Si ce n'est pas ce que vous vouliez,
sed
on peut vous dire de conserver l'un des sauts de ligne. Cela signifie choisir un caractère de remplacement de saut de ligne qui peut être mis en correspondance.Le caractère spécial
\f
et l'utilisation d'une référence arrière qui ne correspond peut-être à rien ne sont pas garantis pour fonctionner comme prévu dans toutes lessed
implémentations. (J'ai confirmé que cela fonctionne sur GNU sed 4.07 et 4.2.2.)la source
test.sas
au milieu du pipeline là-bas, alors lisezsed
directement à partir de celui-ci, et le premiertr
n'a aucun effet. Vous devez utilisercat test.sas | tr ...
en utilisant une ligne sed pour supprimer les commentaires:
la source