correspondant au début de la ligne dans l'expression rationnelle cygwin

2

Je postule sed 's/^ bug*/__/'à

  ref      bug
  bug      ref

et obtenir

  ref     __
 __      ref

La même chose est répondu pour perl, perl -ni -e 's/^ bug/__/; print'. Un exemple de fichier peut être téléchargé ici . Sed et perl sont des utilitaires cygwin que je lance à partir de la ligne de commande Windows. Quand je les exécute à travers cygwin bash, cela n'arrive pas.

Val
la source

Réponses:

4

Le problème concerne les "défauts" de cmd.exe (faute d'un meilleur mot) et la gestion des caractères non alphanumériques entre guillemets simples dans ce cas. Essentiellement, les caractères curseur et espace sont ignorés.

Le moyen le plus simple d'éviter le problème (si son exécution dans un shell Cygwin bash approprié n'est pas une option souhaitable) serait d'utiliser des guillemets doubles à la place ...

C:\cygwin\home\costa\wk>sed 's/^  bug*/__/' sed.txt
  ref    __
__      ref

C:\cygwin\home\costa\wk>sed "s/^  bug*/__/" sed.txt
  ref      bug
__      ref
Costa
la source
qu'as-tu utilisé là-bas? cygwin's sed de cmd.exe? C'est de la triche, vous pouvez aussi bien utiliser un port Windows de sed.
Barlop
OP a déclaré que c'était ce qu'il était en train de faire (lancer l'exécutable sed de Cygwin à partir de cmd.exe). C'était donc la source de son problème et c'est pourquoi j'ai répondu à ce cas d'utilisation. :) Je me suis assuré de mentionner que l'utilisation d'un env. Cygwin approprié rend cette solution de contournement inutile, mais je ne connais pas sa situation. Peut-être que ce n'est pas une option pour lui pour une raison quelconque.
Costa
Tout d'abord, il n'y a pas de triche. Deuxièmement, tous les instructeurs Sed enseignent en utilisant des guillemets simples. Troisièmement, les guillemets simples fonctionnent dans Windows - les guillemets doubles fonctionnent dans cygwin. Rien de fou ici. Enfin, j'ai dit que ce problème se produisait sous Windows. J'ai dit que je n'ai utilisé cygwin bash que pour des tests. Rien de fou n'est ici. Vous ne pouvez tout simplement pas lire. Donc, la seule personne folle qui est venue ici pour produire des décharges de déchets ici, c'est vous.
Val
0

Tout d'abord, utilisez ceci à la place:

sed 's/^ *bug-+/__/' input

De cette façon, cela fonctionnera pour plusieurs espaces avant buget un ou plusieurs tirets après. Ce n'est cependant qu'un détail mineur. La commande que vous avez postée fonctionne bien sur ma Debian.

Pourriez - vous poster le même fichier que vous essayez de modifier quelque part? Je suppose que vous avez des fins de ligne de style Windows ou Mac, ce qui peut confondre sed. Si j'ai raison, cela devrait aider:

perl -pi -e 's/\r\n|\n|\r/\n/g' input

Ensuite, exécutez à nouveau la même sedcommande sur le fichier.

Si cela ne fonctionne pas, il peut y avoir quelque chose de spécifique à propos de cygwin sed. Essayez plutôt cette commande Perl (après vous être assuré que le caractère de fin de ligne correspond \nà la commande ci-dessus):

perl -ne 's/^\s*bug-+/__/; print'
terdon
la source
J'ai remplacé \ r \ n par \ n et j'ai essayé votre script Perl appliqué au fichier `single - ref - 91 0,667 | ref - 49 0,182 | bug - 32 0,354 | ref-100 0,500 `ligne. Le résultat est `ref - 91 0,667 | ref - 49 0,182 | __32 0,354 | ref-100 0,500`. Donc, perl semble se comporter aussi mal que cygwin / sed. Les expressions régulières sont brisées partout.
Val
Umm ... ça marche très bien ici. Pourriez-vous poster votre fichier réel quelque part? On dirait qu'il y a quelque chose d'étrange avec ça.
Terdon
J'ai inclus le lien dans la question
Val
Eh bien, le fichier que vous avez chargé n'a pas de nouvelle ligne ( \n) à la fin de la ligne, mais cela ne devrait pas être pertinent ici. Ma commande Perl et votre commande sed donnent le résultat souhaité. Essayez plutôt ceci: sed -b s/^ bug--*/__/est-ce que ça marche?
terdon
Non, quand je demande sed -b 's/^ bug*/__/'à spaces ref spaces bug je reçois spaces ref spaces __ et 's / ^ \ s * bug * / __ /' produit `` espaces ref__
Val
0

(Ceci est censé être un commentaire, mais je n'ai pas assez de réputation pour ajouter un commentaire pour le moment ...)

Tu viens de frire mon cerveau. Dans mon Cygwin, la même chose se produit. J'étais choqué. Cela semble être un bogue dans la façon dont les caractères génériques sont gérés, qu’ils utilisent la syntaxe d’expression régulière ou le style glob (glob - style est où * signifie «n’importe quel nombre de caractères», expression régulière * signifie «0 ou plusieurs des personnages précédents '.

Alors je l'ai essayé dans mon shell QNX. Cela fonctionne IFF je n'essaye pas d'utiliser un bogue plus avant, comme dans "s / ^ + bug - / __ /". Je peux substituer un * à la place du + et cela fonctionne. Je pense que certaines implémentations de sed ont du mal à choisir la syntaxe regex ou glob et le résultat est un désordre imprévisible.

Je n'ai pas essayé Perl (je ne l'ai pas encore installé sur cette nouvelle machine), mais je serais doublement choqué si Perl le traitait aussi mal.

Pour répondre à votre question, autant que je sache et environ 100 000 de mes amis les plus proches sur Google, votre compréhension de la manière dont l'opérateur ^ devrait fonctionner est exacte.

kmort
la source
Je ne cours pas de cygwin, pour être le plus excitant. J'utilise la ligne de commande Windows mais je pense que l'utilitaire cygwin sed est appelé car Windows n'en a pas. Toutefois, si vous exécutez la ligne de commande cygwin, nous devrions convenir que le problème n’est pas le processeur de ligne de commande.
Val
@Val accrocher, pourriez-vous s'il vous plaît expliquer exacly ce que vous faites? Est-ce sur la ligne de commande de Windows? Sur Linux? Sur cygwin?
Terdon
Messieurs, je dis explicitement que l’utilisation de la ligne de commande Windows et du fichier sed de cygwin est appelée. Sed et perl sont tous deux fournis par cygwin.
Val