我有如下文件夹结构
resources/folder1 , /folder2 , /folder3
现在我希望这个文本以换行符为前缀:
{% extends '::layout.html.twig' %}
{% block body %}
这应该附在底部
{% endblock %}
资源下的文件夹和子目录中的所有文件。这可能吗?
答案 0 :(得分:2)
可能有无数种方法可以做到这一点。根据不包含空格等的文件名,您可以使用:
find resources -type f -print |
while read file
do
{
echo "{% extends '::layout.html.twig' %}"
echo "{% block body %}"
cat $file
echo "{% endblock %}"
} > tmp.$$
cp tmp.$$ $file
rm -f tmp.$$
done
大括号对所附命令执行I / O重定向。在命令的同一行上准确使用它们有点棘手,但上面的代码很简单。如果您不在恶劣的环境中工作,则重定向到tmp.$$
即可。如果您认为人们可能在您运行脚本时颠覆您,则可能需要使用mktemp
或其他命令。如图所示完成的cp
和rm
意味着如果任何文件实际上是符号链接(或硬链接),则不会遇到问题;链接被保留。 mv tmp.$$ $file
等替代方案会破坏链接或符号链接。
答案 1 :(得分:2)
您可以使用sed
:
sed -i -e "
1s/^/\n{% extends '::layout.html.twig' %}\n{% block body %}\n/ ;
$s/$/\n{% endblock %}/
" $(ls -R resources/folder* )
答案 2 :(得分:2)
将目录更改为resources
,创建两个模板文件:BEGIN
和END
。
{% extends '::layout.html.twig' %}
{% block body %}
{% endblock %}
sed -i '1s/^/\n/' */*
sed -i -e '1rBEGIN' -e '$rEND' */*
sed -i '1d' */*
没有反斜杠逃脱,这个解决方案非常简单明了,并且可以很好地扩展。
答案 3 :(得分:0)
最简单的方法是分两步:
egrep -r -l "{% extends '::layout.html.twig' %}" resources/ |xargs sed -i 's/ \{\%\ extends\ \'\:\:layout\.html\.twig\'\ \%\} /\n \{\%\ extends\ \'\:\:layout\.html\.twig\'\ \%\}/g'
然后:
egrep -r -l "{% extends '::layout.html.twig' %}" resources/ |xargs sed '$ a\\n'