Skip to content
Advertisement

Using sed to replace uppercase to lowercase, space to underscore then create a xml file with results

Apologies ahead of time if this is stated wrongly as I have searched but could not find how to sed + echo while using while loop to read a file.

I have a before.txt file that looks like this:

The sun is Shining
The moon is dull tonight
I Feel Like Dancing

and I need it to look like this:

<message>
        <source>the_sun_is_shinig</source>
        <translation>The sun is Shining</translation>
</message>
<message>
        <source>the_moon_is_dull_tonight</source>
        <translation>The moon is dull tonight</translation>
</message>
<message>
        <source>i_feel_like_dancing</source>
        <translation>I Feel Like Dancing</translation>
</message>

This is what I have so far …

#!/bin/bash

echo -n "" > json.xml
while IFS='' read -r line || [[ -n "$line" ]]; do
   sed -e 's/(.*)/L1/; s/ /_/g' < "$line" > temp.txt
   sourceline="$(cat temp.txt)"
   echo "<message>" >> json.xml
   echo -e "t<source>${sourceline}<source>" >> json.xml
   echo -e "t<translation>${line}<translation>" >> json.xml
   echo "<message>" >> json.xml
done < "$1"
rm -f temp.txt
cat json.xml
exit

But it fails

cp@0000 ~/work $ bash .language_file_fixer.sh before.txt
.language_file_fixer.sh: line 5: The sun is Shining: No such file or directory
cat: temp.txt: No such file or directory
.language_file_fixer.sh: line 5: The moon is dull tonight: No such file or directory
cat: temp.txt: No such file or directory
.language_file_fixer.sh: line 5: I Feel Like Dancing: No such file or directory
cat: temp.txt: No such file or directory
<message>
        <source><source>
        <translation>The sun is Shining<translation>
<message>
<message>
        <source><source>
        <translation>The moon is dull tonight<translation>
<message>
<message>
        <source><source>
        <translation>I Feel Like Dancing<translation>
<message>

How do I pipe the $line into sed?

Advertisement

Answer

You can do it completely with GNU sed (sed does read input file, line by line and read your instructions to process each line):

Input:

$ more messages 
The sun is Shining
The moon is dull tonight
I Feel Like Dancing

Output:

$ sed -n 'h;s/(.*)/L1E/;s/ /_/g;s/(.*)/<message>nt<source>1</source>/p;x;s/(.*)/t<translation>1</translation>n</message>/p' messages 
<message>
        <source>the_sun_is_shining</source>
        <translation>The sun is Shining</translation>
</message>
<message>
        <source>the_moon_is_dull_tonight</source>
        <translation>The moon is dull tonight</translation>
</message>
<message>
        <source>i_feel_like_dancing</source>
        <translation>I Feel Like Dancing</translation>
</message>

Explanations:

For reading purpose let me split the command on several lines:

sed -n 'h; 
s/(.*)/L1E/;  
s/ /_/g; 
s/(.*)/<message>nt<source>1</source>/p; 
x; 
s/(.*)/t<translation>1</translation>n</message>/p' messages
  • Test is done with GNU sed 4.2.2
  • -n option to deactivate the autoprint mode
  • h to save the line in the hold buffer (all the operations hereunder will be done on the pattern buffer)
  • s/(.*)/L1E/g is used to transform the whole line in lowercase
  • s/ /_/g is used to transform the spaces in underscores
  • s/(.*)/<message>nt<source>1</source>/p is used to add the starting tag <message> followed by a line feed, a tab and <source> </source> surrounding the transformed message
  • p is used to print it
  • x is used to exchange the two buffers, after doing this operation the pattern buffer contains the line as-is
  • s/(.*)/t<translation>1</translation>n</message>/p is used to add the <translation> tags and ending </message> tag before printing the result via p
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement