1

I am working on a shell script which is getting data from another program and I am using that variable value to read the content from file and append few things inside those data at start and bottom:

Below is an example:

readonly file_location=$location
readonly client_id = $id
readonly client_types = $type_of_client

Here $location, $id and $type_of_client value is being passed from another program. Below is an example:

  • $location will be full path name like this: /home/david/data/12345678
  • $id will be number: 120
  • $type_of_client will be space separted word: abc def pqr

Now inside this location /home/david/data/12345678 I have files like this: abc_lop.xml, def_lop.xml and pqr_lop.xml. Meaning _lop.xml is going to be same always so we can hardcode this. We just need to iterate client_types variable and make a file name as shown above and read the whole file into a String for now (or may be if there is any other better way). This I got working as shown below:

#!/bin/bash

readonly file_location=$location
readonly client_id=$id
readonly client_types=$type_of_client

for word in $client_types
do
    echo $word
    file_value=`cat "file_location"/"$word"_lop.xml`
    echo $file_value
done

Now I need to do something special like string manipulation in shell script and I am not sure how we can do that. Now whatever value we read from those file I need to append something at the top of it and something at the bottom of it in all those files which we are reading. I need to do exactly same thing as shown below:

For example: If file abc_lop.xml is like this after we view it using vi:

<Hello version="100">

<!-- some stuff here -->

</Hello>

I need to make it like this:

<hello_function>
<name>Data</name>
<Hello version="100">

<!-- some stuff here -->

</Hello>
</hello_function>

As you can see, I added this at the top <hello_function><name>Data</name> and I added this at the bottom </hello_function>. How can we do this in shell script?

So In general echo $file_value should print out above appened values for each of those client_types:

#!/bin/bash

readonly file_location=$location
readonly client_id=$id
readonly client_types=$type_of_client

for word in $client_types
do
    echo $word
    file_value=`cat "file_location"/"$word"_lop.xml`
    // may be do something here?
    echo $file_value // this should print out appended string value both at top and bottom.
done

Each of those XML files will be less than 10MB for sure.

2

There's no need to read into a variable if all you're doing is outputting the data. For your main loop:

for word in $client_types; do
    echo "$word"
    echo '<hello_function>'
    echo '<name>Data</name>'
    cat "$file_location/${word}_lop.xml"
    echo '</hello_function>'
done

Of course, this outputs the concatenation of all the modified files, which may be hard to separate later. But it works.

Edit: To output to separate files:

for word in $client_types; do
    fn="${word}"_new.xml
    echo "$word"
    echo '<hello_function>' >>"$fn"
    echo '<name>Data</name>' >>"$fn"
    cat "$file_location/${word}_lop.xml" >>"$fn"
    echo '</hello_function>' >>"$fn"
done

Depending, of course, on just what you want in each file.

  • Thanks for your suggestion. My plan is to use this modified value which has string appended at top and bottom later on for some other purpose. So I wanted to store that in a variable or make a new file with it. Do you think there is any way we can do that? – david Sep 15 '15 at 22:02
  • It's usually not best to try to store long texts in bash variables. To output each one to a file, you could do something like edit above. – Tom Hunt Sep 15 '15 at 22:07
  • Ok so that means, abc_new.xml file will have appended string at top and bottom right? – david Sep 15 '15 at 22:09
  • Yes. You can set the filename to whatever, of course. – Tom Hunt Sep 15 '15 at 22:10
  • Sorry about that, you're quite right, I got carried away quoting. – terdon Sep 15 '15 at 22:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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