commande sed pour supprimer une correspondance trouvée

J’ai un fichier “fruit.xml” qui ressemble à ce qui suit:

FRUIT="Apples" FRUIT="Bananas" FRUIT="Peaches" 

Je veux utiliser une seule commande de ligne SED pour trouver toutes les occurrences de NAME=" et je veux supprimer la valeur entre "" de toutes les correspondances trouvées.

Donc, le résultat devrait ressembler à:

 Apples Bananas Peaches 

C’est la commande que j’utilise:

 sed 's/.*FRUIT="//' fruit.xml 

Le problème est que cela laisse le dernier " à la fin de la valeur dont j’ai besoin, par exemple: les Apples" .

Attrapez simplement le groupe et imprimez-le: attrapez tout de " jusqu’à ce qu’un autre " soit trouvé avec le () (ou \(...\) si vous n’utilisez pas l’option -r ). Ensuite, imprimez-le avec \1 :

 $ sed -r 's/.*FRUIT="([^"]*)"/\1/' file Apples Bananas Peaches 

Vous pouvez également utiliser des séparateurs de champs avec awk : dites à awk que vos séparateurs de champs sont soit FRUIT=" ou " . De cette façon, le contenu souhaité devient le deuxième champ.

 $ awk -FS='FRUIT="|"' '{print $2}' file Apples Bananas Peaches 

Pour que votre commande fonctionne, il suffit de supprimer le " à la fin de la ligne:

 $ sed -e 's/.*FRUIT="//' -e 's/"$//' file ^^ ^^^^^^^^^^^ | replace " in the end of line with nothing -e to allow you use multiple commands 

Ce serait suffisant si vous voulez garder les espaces principaux,

 sed 's/\bFRUIT="\([^"]*\)"/\1/' fruit.xml 

OU

 sed 's/\bFRUIT="\|"//g' fruit.xml 

Essayez ceci, cela remplace la ligne avec le fruit fondé dans les citations:

 sed 's/.*FRUIT="\(.*\)"/\1/' test.xml 

Utilisez une commande de cut simple

 cut -d '"' -f2 fruits.xml 

Sortie:

 Apples Bananas Peaches 

en supposant 1 occurrence par valeur et avec ce format

 sed 's/.*="//;s/".*$//' fruit.xml