Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I wanted to create a script that I could check .xhtml files for images and add alt tags if needed. While searching I found regular expressions and did man on glob but I'm unsure on where or what to search within awk and sed. What would be the best option to do the following:

<img class="something" width="something" height="something" src="folder/folder/image.png" />

<img id="something" src="folder/folder/file.png" />

I wanted the desired script to detect if an alt="" is present if not alt the file name.

End desired format:

<img class="something" width="something" height="something" src="folder/folder/image.png" alt="image"/>

<img id="something" src="folder/folder/file.png" alt="file"/>

I know it can be done but Im not sure where to read about it.

  • Find <img with the ending />
  • Within img tag detect alt=""
  • if alt="" is not present record name before file type and insert into ""
share|improve this question
Just a warning: it is not possible to parse XML-type languages reliably with regular expressions as XML is not a regular language. The best you can do is an ad-hoc approximation for a restricted subset of valid (X)HTML. It'd help if you could list as many characteristics of your input as possible. E.g. does the string <img occur outside the context of a valid image tag anywhere? How about alt=? Can tags span multiple lines? Complications like this are what make the problem impossible unless you place some additional restrictions on it. – jw013 Dec 14 '12 at 21:54
I wouldn't know where to begin. I just need to find a way to identify all img tags and make sure an alt tag is present – Darth_Vader Dec 14 '12 at 22:11
up vote 3 down vote accepted

One way using perl with the help of the XML::Twig parser:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::Twig;
use File::Spec;

my $twig = XML::Twig->new(
    twig_handlers => {

        ## For each 'img' tag execute following function...
        'img' => sub {

            ## If it doesn't have an 'alt' attribute...
            if ( ! $_->att_exists( 'alt' ) ) { 

                ## Get value of 'src' tag.
                my $src = $_->att( 'src' );
                return unless $src;

                ## Get last part of the path and remove extension.
                my $src_file = (File::Spec->splitpath( $src ))[2] || q{};
                $src_file =~ s/\.[^.]+$//;

                ## Create the 'alt' attribute.
                $_->set_att( 'alt', $src_file );
    pretty_print => 'indented',
)->parsefile( shift )->print;

Run it with your xml file as unique argument, like:

perl script.pl xmlfile
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.