2017-04-14 68 views
1

随着SED的内容替换模式的第一次出现,我试图取代第一发生的注释中的脚本,如:桑达/ awk中:与另一个文件

#ENTRYPOINT_CONTENT

将第二个文件($ file_content)的内容转换为另一个第三个文件(/base.sh)。

因此,根据很多文档,该字符串应该是很简单的,是这样的:

sed "s|\#ENTRYPOINT_CONTENT|$file_content|" /base.sh

但我总是喜欢错误结束:

sed: -e expression #1, char 23: unterminated s' command

或类似消息,也尝试了不同的分隔符,即使使用Awk代替,但没有成功,在搜索模式中转义#后似乎没有问题,但仍然无法将文件内容作为变量le在Sed。

任何想法,无论是与Sed或Awk?

编辑:--------------------

@Sundeep @詹姆斯布朗:

不想混科目也不会太长:)在本次编辑结束时,对你澄清请求的回应以粗体显示,但仅仅为了详细说明上下文,我的情况是在bash中的Docker入口点脚本(用于基本Docker镜像),称为/root/test/base

#!/usr/bin/env bash 

#ENTRYPOINT_CONTENT 

if [[ -e "/root/test/custom" ]]; then 

    printf "\n\n#ENTRYPOINT_CONTENT\n" >> /root/test/custom 

    # Code from whjm's reply below (actually works but appends shebangs from custom files) 
    sed -e '0,/^#ENTRYPOINT_CONTENT/!b; /^#ENTRYPOINT_CONTENT/{ r /root/test/custom' -e 'd; }' /root/test/base.sh >> /root/test/base2.sh 

    mv /root/test/base2.sh /root/test/base.sh 
    rm -f /root/test/custom 

fi 

我只想让用户自己砸自己的另一bash脚本的特定路径上(比如说/root/test/定制),例如:

#!/usr/bin/env bash 
echo 'My 2nd bash code' 

以上(基地)第一个脚本应插入内容在定制文件在#ENTRYPOINT_CONTENT位置(在基本脚本本身,不删除此搜索字符串),像这样:

#!/usr/bin/env bash 

echo 'My 2nd bash code' 

#ENTRYPOINT_CONTENT 

if [[ -e "/root/test/custom" ]]; then 

    printf "\n\n#ENTRYPOINT_CONTENT\n" >> /root/test/custom 

    # Code from whjm's reply below 
    sed -e '0,/^#ENTRYPOINT_CONTENT/!b; /^#ENTRYPOINT_CONTENT/{ r /root/test/custom' -e 'd; }' /root/test/base.sh >> /root/test/base2.sh 

    mv /root/test/base2.sh /root/test/base.sh 
    rm -f /root/test/custom 

fi 

如果另一个用户后滴肛在相同的路径疗法自定义脚本,我们应该有附加这样的第三自定义脚本的代码:

#!/usr/bin/env bash 
echo 'My 2nd bash code' 
echo 'My 3rd bash code' 
#ENTRYPOINT_CONTENT 

if [[ -e "/root/test/custom" ]]; then 
# ... and so on 

关于从自定义文件的shebangs,它不是一个真正的问题,如果他们被追加到基本文件, @whjm的sed代码按预期工作,但会追加它们,而令人惊讶的是@James Brown的两个awk代码已经(并优雅地)忽略了自定义文件中的所有额外shebang(可能是因为它们也以#开头,作为#ENTRYPOINT_CONTENT搜索字符串),但目前部分preprend像代码:

#!/usr/bin/env bash 
echo 'My 3rd bash code' 
echo 'My 2nd bash code' 
#ENTRYPOINT_CONTENT 

当我试图把它附加像:

#!/usr/bin/env bash 
echo 'My 2nd bash code' 
echo 'My 3rd bash code' 
#ENTRYPOINT_CONTENT 

因此,简而言之,@Sundeep,如果你能不能给我的这个您AWK代码的更新版本,这将是完美的! :D(找不到方法来颠倒这个......)非常感谢。从以前的帖子

代码:

NR==FNR { b=b (FNR==1?"":ORS) $0; next } 
{ r=r (FNR==1?"":ORS) $0 } #ENTRYPOINT_CONTENT 
END { sub(/\#[^\n]+/,r,b); print b} 
+0

你会得到错误,如果'$ file_content'有换行符,则'|'字符,等等...如果你可以添加一个小小的'base.sh'和'file_content'内容,它将有助于为你提供一个解决方案......尤其是创建一个包含多个'#ENTRYPOINT_CONTENT'的示例并显示期望的输出 – Sundeep

+0

@Sundeep:我在上面编辑的答案 – glc

回答

0

如果您使用GNU sed的:

[STEP 101] # cat file1 
11 
xx // replace me 
44 
xx // don't replace me 
55 
[STEP 102] # cat file2 
22 
33 
[STEP 103] # sed -e '0,/^xx/!b; /^xx/{ r file2' -e 'd }' file1 
11 
22 
33 
44 
xx // don't replace me 
55 
[STEP 104] # 
+0

非常棒!非常感谢 !对于其他读者,上面代码中的'xx'是要搜索和替换的字符串(在我的情况下是'#ENTRYPOINT_CONTENT') – glc