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

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

我有两个不同的文件:

文件1

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

文件2

<TEXT1>
<TEXT2>

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

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

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

答案1

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

/<TEXT1>/ {
  r File1
  d
}

运行它:

$ sed -f script.sed File2
/home/user1/
/home/user2/bin
/home/user1/a/b/c
<TEXT2>

答案2

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

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

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

答案3

我回答是因为diff/patch方法在某些情况下可能会感兴趣。要定义文件中包含的行替换blob1blob2use 中包含的行:

diff -u blob1 blob2 > patch-file

例如,如果blob1包含:

hello
you

blob2包含:

be
welcome
here

生成的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

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

patch somefile patch-file

它将把hello,you行替换为be, welcome,here中的行somefile

相关内容