Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

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.

share|improve this question
    
Please paste that error message so we can locate its source. Also tell us which sed implementation are you using. You code works for me with GNU sed. –  manatwork Sep 8 '11 at 14:40
    
Sorry, Not getting an error. I am not getting desired output. Output is like /home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>. Not getting new lines. –  chanchal1987 Sep 8 '11 at 14:51
    
Not sure if this would apply in your specific case, but with diff and patch tools allow to replace some lines in a file by other lines quite easily. –  Stéphane Gimenez Sep 8 '11 at 14:54
    
Btw, using random data gathered with $() in a sed script makes my eyes bleed. Never use external data in places where some characters are interpreted with special meaning. –  Stéphane Gimenez Sep 8 '11 at 14:59
    
@Stéphane Gimenez: Now please answer. –  chanchal1987 Sep 8 '11 at 14:59
add comment

2 Answers

up vote 7 down vote accepted

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>
share|improve this answer
    
Thanks this is working. But I don't want to use any other script file. Are there any inline solution? –  chanchal1987 Sep 8 '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 8 '11 at 15:46
2  
with bash, posix-style strings are a bit cleaner: sed $'/<TEXT1>/ {r File1\n d}' –  glenn jackman Sep 8 '11 at 17:18
1  
Also with -e for a one liner: sed -e '/<TEXT1>/{r File1' -e 'd}' File2 –  sdaau Jun 7 '12 at 14:12
add comment

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.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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