随着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}
你会得到错误,如果'$ file_content'有换行符,则'|'字符,等等...如果你可以添加一个小小的'base.sh'和'file_content'内容,它将有助于为你提供一个解决方案......尤其是创建一个包含多个'#ENTRYPOINT_CONTENT'的示例并显示期望的输出 – Sundeep
@Sundeep:我在上面编辑的答案 – glc