使用 sed 将字符串替换为文件内容

cha*_*987 24 sed replace

我有两个不同的文件:

文件 1

/home/user1/  
/home/user2/bin  
/home/user1/a/b/c
Run Code Online (Sandbox Code Playgroud)

文件 2

<TEXT1>
<TEXT2>
Run Code Online (Sandbox Code Playgroud)

我想替换<TEXT1>文件2与内容文件1使用sed。我试过这个命令,但没有得到正确的输出:

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

您也可以使用其他工具来解决此问题。

Kus*_*nda 24

这是一个 sed 脚本解决方案(比尝试在命令行上将其放入一行更容易):

/<TEXT1>/ {
  r File1
  d
}
Run Code Online (Sandbox Code Playgroud)

运行它:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>
Run Code Online (Sandbox Code Playgroud)

  • 还有 [-e](http://www.unix.com/shell-programming-scripting/31092-replace-string-content-another-file.html#4) 用于单行:`sed -e '/ &lt;TEXT1&gt;/{r File1' -e 'd}' File2` (9认同)
  • 使用 bash,posix 样式的字符串更简洁一些:`sed $'/&lt;TEXT1&gt;/ {r File1\nd}'` (6认同)

mar*_*756 10

我花了很长时间才找到使用 var 替换的解决方案。所有 sed 解决方案对我都不起作用,因为它们要么删除完整的行,要么不正确地替换。

FILE2=$(<file2)
FILE1=$(<file1)
echo "${FILE2//TEXT1/$FILE1}" 
Run Code Online (Sandbox Code Playgroud)

将 file2 中所有出现的 TEXT1 替换为 file1 的内容。所有其他文本保持不变。


Sté*_*nez 7

我回答是因为diff/patch方法在某些情况下可能很有趣。定义包含在文件中的行的置换blob1由包含在线路blob2使用:

diff -u blob1 blob2 > patch-file
Run Code Online (Sandbox Code Playgroud)

例如,如果blob1包含:

hello
you
Run Code Online (Sandbox Code Playgroud)

blob2包含:

be
welcome
here
Run Code Online (Sandbox Code Playgroud)

生成的patch-file将是:

--- 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
Run Code Online (Sandbox Code Playgroud)

现在,您可以将此补丁应用于任何其他文件:

patch somefile patch-file
Run Code Online (Sandbox Code Playgroud)

它将替换hello,yoube, welcome,heresomefile