开发者

Use the contents of a file to replace a string using SED

What would be the sed command for mac shell scripting that would replace all iterations of string "fox" with the entire string content of myFile.txt.

myFile.txt would be html content with line brea开发者_运维百科ks and all kinds of characters. An example would be

    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>

Thanks!

EDIT 1

This is my actual code:

sed -i.bkp  '/Q/{
s/Q//g
r /Users/ericbrotto/Desktop/question.txt
}' $file

When I run it I get:

sed in place editing only works for regular files. 

And in my files the Q is replaced by a ton of chinese characters (!). Bizarre!


You can use the r command. When you find a 'fox' in the input...

/fox/{

...replace it for nothing...

    s/fox//g

...and read the input file:

    r f.html
}

If you have a file such as:

$ cat file.txt
the
quick
brown
fox
jumps
over
the lazy dog
fox dog

the result is:

$ sed '/fox/{
    s/fox//g
    r f.html
}' file.txt
the
quick
brown

    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>
jumps
over
the lazy dog
 dog
    </div>
  </div>
  <br>
  <div id="container2">
    <div class="question" onclick="javascript:show('answer2')";>

EDIT: to alter the file being processed, just pass the -i flag to sed:

sed -i '/fox/{
    s/fox//g
    r f.html
}' file.txt

Some sed versions (such as my own one) require you to pass an extension to the -i flag, which will be the extension of a backup file with the old content of the file:

sed -i.bkp '/fox/{
    s/fox//g
    r f.html
}' file.txt

And here is the same thing as a one liner, which is also compatible with Makefile

sed -i -e '/fox/{r f.html' -e 'd}'


Ultimately what I went with which is a lot simpler than a lot of solutions I found online:

str=xxxx
sed -e "/$str/r FileB" -e "/$str/d" FileA

Supports templating like so:

str=xxxx
sed -e "/$str/r $fileToInsert" -e "/$str/d" $fileToModify


Another method (minor variation to other solutions):

If your filenames are also variable ( e.g. $file is f.html and the file you are updating is $targetfile): sed -e "/fox/ {" -e "r $file" -e "d" -e "}" -i "$targetFile"

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜