2 votes

Remplacer une chaîne de caractères dans l'attribut ALT à l'aide de SED

J'ai un fichier HTML qui contient l'attribut ALT suivant :

alt="Hello I am <nobr>Please&nbsp;replace&nbsp;me</nobr> and I'm cool"

J'ai besoin d'utiliser SED dans un script bash pour remplacer la ligne ci-dessus par :

alt="Hello I am Please replace me and I'm cool"

Comment cibler uniquement la balise à l'intérieur d'un attribut alt ?

1voto

RavinderSingh13 Points 29608

Si vous êtes d'accord avec awk essayez alors ce qui suit : (en prenant toutes les chaînes de caractères que vous voulez substituer dans les variables de awk )

awk -v val="<nobr>" -v val1="&nbsp;" -v val2="</nobr>" '
/^alt/{
  gsub(val," ")
  gsub(val1," ")
  gsub(val2," ")
}
1'  Input_file

OU

awk -v val="<nobr>" -v val1="&nbsp;" -v val2="</nobr>" '
/^alt/{
  gsub(val"|"val1"|"val2," ")
}
1'  Input_file

Ajouter > temp_file && mv temp_file Input_file aux codes ci-dessus, au cas où vous souhaiteriez apporter des modifications au fichier Input_file lui-même.

1voto

Joseph Quinsey Points 4450

A sed serait la réponse :

 sed -E '/alt=/{:a s/(<nobr>)(.*)&nbsp;(.*)(<\/nobr>)/\1\2 \3\4/;ta; s/<nobr>(.*)<\/nobr>/\1/}'

Explication :

  • /alt=/ ne modifie que les lignes contenant alt=
  • s/(<nobr>)(.*)&nbsp;(.*)(<\/nobr>)/\1\2 \3\4/ remplacer un &nbsp; avec l'espace
  • ta répéter en cas de succès, c'est-à-dire passer à a
  • s/<nobr>(.*)<\/nobr>/\1/ enfin, supprimer le <nobr> y </nobr>

Ajouté : Parce que sed est gourmand, ce script va échouer s'il y a deux </nobr> dans la ligne. Bien qu'il existe des solutions de contournement, voir ishahak \s répondre à Correspondance de regex non gourmande (réticente) dans sed ? --Cela devient pénible.

En tout état de cause, cette réponse est déjà excessive, puisque le PO a trouvé une solution beaucoup plus simple pour répondre à ses besoins ; voir le commentaire ci-dessous.

0voto

keithpjolley Points 1184

Voici une façon maladroite de le faire :

% sed $'s#alt="Hello I am <nobr>Please&nbsp;replace&nbsp;me</nobr> and I\'m cool"#alt="Hello I am Please replace me and I\'m cool"#' < file.html

Je vous conseille de ne pas analyser le code html à l'aide d'outils de type "shell", ce qui ne ferait qu'engendrer des larmes et de la frustration. Utilisez la fonction BeautifulSoup à la place.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X