2009-10-20 9 views
0

Fichier1:Comment utiliser sed pour supprimer une chaîne avec des caractères génériques

<a>hello</b> <c>foo</d> 
<a>world</b> <c>bar</d> 

est un exemple du fichier ceci fonctionnerait sur. Comment peut-on supprimer toutes les chaînes qui ont un <c>*</d> en utilisant sed?

+0

Que voulez-vous dire par "supprimer toutes les chaînes"? Voulez-vous dire enlever toute cette ligne ou juste ce bloc de texte? –

+0

Toutes les chaînes commençant par et se terminant par. La commande ci-dessous a fonctionné parfaitement. De toute évidence, toute personne utilisant la commande doit ajouter le fichier à la fin de la commande. – user191960

Répondre

4

La ligne suivante supprime tout le texte <c>-</d> inclus:

sed -e 's/<c>.*<\/d>//' 

Le bit à l'intérieur du s/...// est une expression régulière, pas vraiment un caractère générique de la même manière que les utilisations du shell, donc tout ce que vous peut mettre dans une expression régulière, vous pouvez mettre là-bas.

+0

Fonctionne parfaitement! Rappelez-vous aux utilisateurs de cette commande d'ajouter le fichier d'entrée/sortie à la fin pour rediriger sed: sed -e 's/. * <\/d> //' In> Out. – user191960

0

si toutes vos données est comme celle de l'exemple

# gawk 'BEGIN{FS=" <c>"}{print $1}' file 
<a>hello</b> 
<a>world</b> 
0

Grande couteau suisse!

Je l'ai modifié pour extraire des informations d'en-tête d'eMails pour un script d'archivage. Cela impliquait de renommer les e-mails IMAP avec les informations de date et d'expéditeur (sinon IMAP juste numéroté 1, 2, 3, etc.). Voici les deux mods:

for i in $mailarray; do date -d $(less -f $i | grep -im 1 "Date:\ " | sed -e 's_^.*\(ate: \)__') +%F_%T%Z; done

for i in $mailarray; do less -f "$i" | grep -iEm 1 "From:\ " | sed -e 's_^.*\(rom\).*<\|^.*\(rom:\).__' | sed -e '[email protected]*$__'; done

Ils ont sauvé beaucoup de codage étrangers. Je vous remercie.

Questions connexes