2016-08-25 2 views
1

J'utilise sed pour trouver et supprimer l'expression de texte avec des parenthèses d'ouverture et de fermeture.Utilisation de sed pour remplacer le contenu entre parenthèses même s'il y en a plusieurs imbriqués

Exemple: sed -re 's/ SCYEXIT\([^)]+\)//g'

Works avec des crochets vides: SCYEXIT(' ') Mais certains de mes lignes de texte ont deux paires de crochets et en boîte la recherche échoue ci-dessus.

exemple défaut: SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit)') Le résultat est: ')

Certains des crochets sont vides (' ') ou avoir un contenu ('FN=/var/mqm/exits/sendexit.data') ou même une autre paire de crochets dans ce comme ('/var/mqm/exits/SecExitSender(SecurityExit)').

Comment puis-je gérer tous les supports correspondants?

Pour rendre les choses plus claires.

Je migre IBM MQ d'une plate-forme à une autre et il existe des différences dans les paramètres pour chaque plate-forme. Un exemple de configuration ressemble à ceci:

DEFINE QLOCAL ('postcard') SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit)') PROCESS(' ') PUT(ENABLED) DEFPRTY(0) REPLACE

Ici, je veux me débarrasser de SCYEXIT et PROCESS attribut indépendant du contenu de la paire de supports suivants. Vous, en tant qu'humain, comprenez immédiatement ce que je veux dire par le support ici. Les crochets peuvent être vides, ou avoir une valeur ou même une valeur imbriquée.

Le résultat que je veux obtenir est la suivante:

DEFINE QLOCAL ('postcard') PUT(ENABLED) DEFPRTY(0) REPLACE

Merci beaucoup Nicolaie

+0

vous devez donner plus de détails sur vos données, comme il y a du texte après la fermeture ')' et ces données peuvent-elles contenir ')'? – Sundeep

+0

Oui @ "sp asic", le texte est après le crochet de fermeture. Exemple d'extrait: DEFINE CHANNEL ('1234567890') CHLTYPE (RCVR) TRPTYPE (TCP) BATCHSZ (50) DESCRIPTION ('') HBINT (300) MAXMSGL (4194304) MCAUSER ('') MRDATA ('') MREXIT ('') MRRTY (10) MRTMR (1000) MSGDATA ('') MSGEXIT ('') NPMSPEED (FAST) PUTAUT (DEF) RCVDATA ('') RCVEXIT ('') SCYDATA ('') SCYEXIT ('/ var/mqm/exits/SecExitSender (SecurityExit) ') REMPLACEZ – Nicolaie

+0

et ce texte contient-il ')'? sinon, essayez 'sed 's/SCYEXIT (. *) // g'' – Sundeep

Répondre

0
$ cat ip.txt 
SCYEXIT(' ') 
DEFINE QLOCAL ('postcard') SCYEXIT('/var/mqm/exits/SecExitSender(SecurityExit)') PROCESS(' ') PUT(ENABLED) DEFPRTY(0) REPLACE 
PROCESS(' ') asd 
1 SCYEXIT(' ') 
PROCESS(' ') 
DEFINE QLOCAL ('postcard') 

Solution utilisant sed

$ sed -E 's/(SCYEXIT|PROCESS)\(\S+\)//g ; s/(SCYEXIT|PROCESS)\(.\s*.\)//g' ip.txt 

DEFINE QLOCAL ('postcard') PUT(ENABLED) DEFPRTY(0) REPLACE 
asd 
1 

DEFINE QLOCAL ('postcard') 
  • (SCYEXIT|PROCESS)\(\S+\) signifie SCYEXIT ou PROCESS suivie d'( puis un ou plusieurs caractères non-blancs et se terminant par )
  • (SCYEXIT|PROCESS)\(.\s*.\) signifie SCYEXIT ou PROCESS follo wed par ( et un caractère, un certain nombre de espaces blancs, un autre personnage et enfin ) -> cela prend en charge les supports vides cas
  • Utilisez [[:space:]] et [^[:space:]] au lieu de \s et \S pour les versions non-GNU

Si perl est disponible,

perl -pe 's/(SCYEXIT|PROCESS)\(.*?\)(|$)//g' ip.txt 

qui donne même résultat que la solution pour la suppression sed sauf l'espace après la fin de support de SCYEXIT ou PROCESS si présent

+0

Merci @ sp-asic, c'est ça. Je dois envelopper ma tête pour comprendre pleinement mais pour l'instant cela fonctionne parfaitement. – Nicolaie

0
sed ':a 
    s/([^()][^()]*)//g 
    t a' 

utilisation [^()] au lieu de [^)], et faire des substitutions à plusieurs reprises jusqu'à ce qu'il n'y ait pas de paire d'accolades correspondantes.

+0

Merci @pdg, mais cela ne fonctionne pas du tout parce que les seconds crochets optionnels sont inclus dans la première parenthèse. – Nicolaie

+0

@Nicolaie oui cela fonctionne pour les supports inclus. 'a (b (c (e f) g) h)) ijl' renvoie' a) ijl' (notez que la parenthèse fermante déséquilibrée est conservée). – pdg