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


23

我有两个不同的文件:

文件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"

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


请粘贴该错误消息,以便我们找到其来源。还请告诉我们sed您使用的是哪种实现。您的代码适用于GNU sed
manatwork 2011年

抱歉,没有收到错误消息。我没有得到想要的输出。输出就像/home/user1/ n/home/user2/bin n/home/user1/a/b/cn <TEXT2>。没有换新线。
chanchal1987 2011年

不知道这是否适用于您的特定情况,但是使用diffpatch工具可以很容易地用其他行替换文件中的某些行。
斯蒂芬·吉梅内斯

1
顺便说一句,使用$()sed脚本中收集的随机数据会使我流血。切勿在某些字符具有特殊含义的地方使用外部数据。
斯蒂芬·吉梅内斯

Answers:


24

这是一个sed脚本解决方案(比起将其放入命令行中的行,更容易引起注意):

/<TEXT1>/ {
  r File1
  d
}

运行它:

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

谢谢,这是工作。但是我不想使用任何其他脚本文件。是否有任何内联解决方案?
chanchal1987 2011年

当然:sed '/<TEXT1>/{rFile1^Md^M}' File2,其中“ ^ M”是按回车键。问题是sed确实需要{...}中的换行符来分隔r和d命令。
库萨兰达

6
使用bash,posix风格的字符串会更干净:sed $'/<TEXT1>/ {r File1\n d}'
glenn jackman 2011年

9
同样使用-e表示一个衬里:sed -e '/<TEXT1>/{r File1' -e 'd}' File2
sdaau 2012年

1
而且,如果<TEXT1>我不想替换整个包含的行,而只想替换字符串本身,而保留其余行,该怎么办呢?Text1: <TEXT1>Text1: <file_contents>
罗宾·温斯洛

9

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

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

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


非常好。可能会比以前更快sed,因为这些“扩展”(又名“替换”)已内置到外壳中(bash至少)
柔和的黄色

7

我之所以回答是因为在某些情况下diff/ patch方法可能引起您的兴趣。要定义文件中包含的行blob1blob2使用中包含的行替换:

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

它将取代helloyou由线bewelcomehere线somefile


这确实很聪明,但是如果您可以通过脚本将其自动化,那就更好了
qodeninja
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.