J'ai une donnée qui est montrée comme ci-dessous dans un fichier test.cs je veux que la sortie soit p> Ceci que je veux réaliser uniquement en utilisant SED P> J'ai essayé en dessous de SED Script et capable de copier et collez l'utilisation de l'espace de noms intérieur p> 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. P> p>
3 Réponses :
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(){
}
}
}
Si vous enregistrez le nom du pas de noms après la première impression, à l'intérieur de la boucle code> pour code>, 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 code>, la sortie doit avoir
à l'aide de la valeur; code> plutôt que
à l'aide d'échantillon.test.value; Code>
@JHNC OP ne pose pas clairement pourquoi le champ change, alors je le laisse comme ça.
Ceci pourrait fonctionner pour vous (GNU SED):
sed '/using/{s/^/ /;s/Sample\.test\.//;H;d};/namespace/{p;g;s/.//;n;/^$/d}' file
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. Le second Bâtiment sur la réponse de @ Jotne, une version AWK équivalente est la suivante: p> la regex ici ( S /// Code> La commande recherche le nom qui précède un
{ code> (c'est-à-dire
\ ([^] * \ \) code>) suivi d'un
en utilisant code> ligne avec ce même nom suivi d'une période (c.-à-d.
\ 2 \ \. code>). L'intégralité de la correspondance à part le trailing
\ 2 \ \. Code> est disponible en tant que
\ 1 code> en raison de l'ensemble initial de
\ ( code> ...
\) code> et remplace le texte d'origine. P>
r code>) Recherche d'un espace suivi du nom de l'espace de noms (il devrait être
2 $ code> sur la ligne d'espace de noms) suivi d'une période. Le
Sub () code> remplace toutes les occurrences de cette regex dans les lignes sauvegardées à l'aide d'un seul espace. P> P>
Pouvez-vous s'il vous plaît expliquez-moi ce que cette regex fait S / ^ (([^] *) {. * En utilisant) \ 2 \ ./ \ 1 /
Le premier ^ code> était une faute de frappe.
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 CODE> 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;} code>
@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.