26

I have two different files:

File1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c

File2

<TEXT1>
<TEXT2>

I want to replace the <TEXT1> of File2 with the contents of File1 using sed. I tried this command, but not getting proper output:

cat File2|sed "s/<TEXT1>/$(cat File1|sed 's/\//\\\//g'|sed 's/$/\\n/g'|tr -d "\n")/g"

You can use other tools also to solve this problem.

3 Answers3

25

Here's a sed script solution (easier on the eyes than trying to get it into one line on the command line):

/<TEXT1>/ {
  r File1
  d
}

Running it:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>
Kusalananda
  • 333,661
  • Thanks this is working. But I don't want to use any other script file. Are there any inline solution? – chanchal1987 Sep 08 '11 at 14:57
  • Sure: sed '/<TEXT1>/{rFile1^Md^M}' File2, where "^M" is you pressing return. The problem is that sed really needs the newlines within the {...} to delimit the r and the d command. – Kusalananda Sep 08 '11 at 15:46
  • 6
    with bash, posix-style strings are a bit cleaner: sed $'/<TEXT1>/ {r File1\n d}' – glenn jackman Sep 08 '11 at 17:18
  • 9
    Also with -e for a one liner: sed -e '/<TEXT1>/{r File1' -e 'd}' File2 – sdaau Jun 07 '12 at 14:12
  • 1
    And what if instead of replacing the entire line containing <TEXT1>, I just want to replace the string itself, leaving the rest of the line intact? Text1: <TEXT1> to Text1: <file_contents>. – Robin Winslow May 10 '14 at 17:13
  • @RobinWinslow - you could use any of the working solutions here (you will just have to slightly adjust the code to replace the pattern instead of appending after pattern). – don_crissti Apr 15 '15 at 15:51
14

Took me a long time to find this solution using var replacement. All sed solutions did not work for me, as they either delete complete lines or replace incorrectly.

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 

Replaces all occurences of TEXT1 in file2 against content of file1. All other text remains untouched.

marcas756
  • 141
7

I answer because the diff/patch method might be of interest in some cases. To define a substitution of lines contained in file blob1 by lines contained in blob2 use:

diff -u blob1 blob2 > patch-file

For example, if blob1 contains:

hello
you

and blob2 contains:

be
welcome
here

the generated patch-file will be:

--- blob1   2011-09-08 16:42:24.000000000 +0200
+++ blob2   2011-09-08 16:50:48.000000000 +0200
@@ -1,2 +1,3 @@
-hello
-you
+be
+welcome
+here

Now, you can apply this patch to any other file:

patch somefile patch-file

It will replace hello,you lines by be,welcome,here lines in somefile.