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