File Replacement Help

Hi all,

I have two files, one is a base file and the other is a dependency file.

I need to replace a section in the base file (File A) with a section from the dependency file (File B), for example:

File A:
...

<TagName>
  <TagA>MyBaseFile</TagA>
  <TagB>MyBaseFileID</TagB>
</TagName>
<TagName>
  <TagA>Other</TagA>
  <TagB>OtherID</TagB>
</TagName>

...

I need to replace the 'TagName' section (in bold) with the section extracted from File B:

...

<TagName>
  <TagA>MyFile</TagA>
  <TagB>12345</TagB>
</TagName>

...

so File A should look like:

...

<TagName>
  <TagA>MyFile</TagA>
  <TagB>12345</TagB>
</TagName>
<TagName>
  <TagA>Other</TagA>
  <TagB>OtherID</TagB>
</TagName>

...

Any idea how this can be achieved in Shell/AWK or Perl (only basic Perl as I wont have the ability to upload new libraries to a server).

Invoke this with the dependecy file (file-B) as the first argument and the base file (file-A) as stdin or the second and subsequent arguments:

undef $/;

# slurp in dependency file

my $depfile = shift(@ARGV);

open FH, '<', $depfile or die $depfile;
my $tag = <FH>;
close FH;

print $tag;

# slurp in the base file

$_ = <>;

# replace section with the dependecy file

s{<TagName>\s*<TagA>MyBaseFile</TagA>\s*<TagB>MyBaseFileID</TagB>\s*</TagName>\s*}{$dep}ms;

print;

Hi Ludwig!

Thanks for the reply.

Will this still work where File A has multiple <TagName> sections? will it only replace one <TagName> section that I am concerned about?

File A has numerous <TagName> sections, I only want to replace one (could appear anywhere) where the <TagName><TagA> section has a value of say 'MyBaseFile' etc...

What I supplied will replace the first instance of <TagA>MyBaseFile</TagA> in the file. Depending on how complicated your files actually are (I assume that what you supplied was a sample), you may want to look at xml parsing modules which can give you very fine control over what is selected..

Hi Ludwig,

My base file looks like this:

<TagName>
<TagA>/MyBasePath/MyBaseFile/</TagA>
<TagB>MyBasePath/MyBaseFile/FileA</TagB>
</TagName>
<TagName>
<TagA>/MyBasePath/MyBaseFile/</TagA>
<TagB>MyBasePath/MyBaseFile/FileB</TagB>
</TagName>
<TagName>
<TagA>/MyBasePath/MyBaseFile/</TagA>
<TagB>MyBasePath/MyBaseFile/FileC</TagB>
</TagName>

My dependency file looks like this:

<TagName>
<TagA>/MyDepPath/MyDepFile/</TagA>
<TagB>MyDepPath/MyDepFile/FileA</TagB>
</TagName>
<TagName><TagA>/MyDepPath/MyDepFile/</TagA>
<TagB>MyDepPath/MyDepFile/FileB</TagB>
</TagName>
<TagName>
<TagA>/MyDepPath/MyDepFile/</TagA>
<TagB>MyDepPath/MyDepFile/FileC</TagB>
</TagName>

I need to replace the section in bold only in the base file by copying the dependency section into the base file section.

How do you select which section in the base file is to be replaced by which section in the dependency file?