I want to edit the config file of a program that is an XML:
<software>
<settings>
...
<setting name="local directory" type="string">/home/username/</setting>
...
</settings>
</software>
What is the easiest way to do this from a bash script?
Thanks
Depending on what you want to do, you may want to use some XML-specific tooling (to handle character encodings, to maintain XML well-formedness etc.). You can use the normal line-oriented tools, but unless you're careful (or doing something trivial) you can easily create non-compliant XML.
I use the XMLStarlet command line set. It's a set of command line utilities for specifically parsing/manipulating XML.
Using xmlstarlet:
xmlstarlet val -e file.xml
xmlstarlet ed -u "//settings/setting/@name" -v 'local directory2' file.xml
xmlstarlet ed -u "//settings[1]/setting/@name" -v 'local directory2' file.xml
# edit file inplace
xmlstarlet ed -L -u "//settings/setting/@name" -v 'local directory2' file.xml
Most people would probably use sed to do line editing from a bash script. If you
actually care about parsing the XML, then use something like Perl which has a ready XML parser.
An ugly/unsafe but sometimes the easiest is to call sed/perl/awk from bash