0
votes

Comment remplacer l'espace motif multiligne dans SED

J'ai une donnée qui est montrée comme ci-dessous dans un fichier test.cs xxx

je veux que la sortie soit xxx

Ceci que je veux réaliser uniquement en utilisant SED

J'ai essayé en dessous de SED Script et capable de copier et collez l'utilisation de l'espace de noms intérieur xxx

mais impossible de remplacer l'espace de noms dans l'utilisation de la déclaration. Ici, dans cet exemple, j'ai pris un exemple comme «Espace d'exemple». Mais c'est un cas réel, cela peut être n'importe quoi.

sed

5 commentaires

IMHO, je pense que ce ne serait pas trivial même dans un véritable langage de programmation. Surtout si vos données d'échantillon ne montrent pas tous les cas de coin que vos données réelles contiennent. Essayer de le faire dans SED est comme avoir à le faire avec les deux mains attachées derrière votre dos. J'espère que quelqu'un peut me prouver faux. Bonne chance.


Abri, merci de rejouer. Pouvez-vous donner une solution uniquement avec le cas expliqué ci-dessus. Parce que dès maintenant, mes fichiers ne contiennent que ces cas. Je veux une solution générique en termes d'espace de noms. Cette solution m'aidera vraiment.


/ ^ en utilisant / {s / ^ / /; h; d;}; / ^ Espace de noms / {g;: a; s / ^ \ (\ ([^] * \) {. * Utilisation \ 2 \ ./ \ \ 1 /; ta; n; s / \ n \ n / \ n / g;}


@JHNC Toute chance que vous puissiez poster (court) explication - peut être comme réponse - comment votre solution fonctionne-t-elle?


@jhnc pouvez-vous s'il vous plaît expliquer dans la section de réponse de votre script.


3 Réponses :


1
votes

Utiliser awk code> peut faire. Mais pas sûr de ce qui déclenche l'action et comment cela fonctionne sur vos données réelles.

awk '/^using/ {s=s"\n"$0;next} /^namespace/ {print $0 s;next} 1' file
namespace Sample.test {
using System;
using System.Data;
using Sample.test.value;

  class testclass{

    public testclass(){


    }
  }
}


3 commentaires

Si vous enregistrez le nom du pas de noms après la première impression, à l'intérieur de la boucle pour , vous pouvez le dépouiller de chaque ligne avant d'imprimer que


Pas tout à fait ce que je voulais dire :) lorsque le nom de l'espace de noms est exemple.test , la sortie doit avoir à l'aide de la valeur; plutôt que à l'aide d'échantillon.test.value;


@JHNC OP ne pose pas clairement pourquoi le champ change, alors je le laisse comme ça.



1
votes

Ceci pourrait fonctionner pour vous (GNU SED):

sed '/using/{s/^/ /;s/Sample\.test\.//;H;d};/namespace/{p;g;s/.//;n;/^$/d}' file


0 commentaires

1
votes

Ce script SED transforme vos données de test mais vous aurez besoin d'altération si vos fichiers contiennent plus d'un bloc d'utilisation / espace de noms, ou si le blancheur n'est pas identique. XXX

Le second S /// La commande recherche le nom qui précède un { (c'est-à-dire \ ([^] * \ \) ) suivi d'un en utilisant ligne avec ce même nom suivi d'une période (c.-à-d. \ 2 \ \. ). L'intégralité de la correspondance à part le trailing \ 2 \ \. est disponible en tant que \ 1 en raison de l'ensemble initial de \ ( ... \) et remplace le texte d'origine.


Bâtiment sur la réponse de @ Jotne, une version AWK équivalente est la suivante: xxx

la regex ici ( r ) Recherche d'un espace suivi du nom de l'espace de noms (il devrait être 2 $ sur la ligne d'espace de noms) suivi d'une période. Le Sub () remplace toutes les occurrences de cette regex dans les lignes sauvegardées à l'aide d'un seul espace.


2 commentaires

Pouvez-vous s'il vous plaît expliquez-moi ce que cette regex fait S / ^ (([^] *) {. * En utilisant) \ 2 \ ./ \ 1 /


Le premier ^ était une faute de frappe.