我有如下的文件夹结构
resources/folder1 , /folder2 , /folder3
现在我希望这个文本前面加上换行符:
{% extends '::layout.html.twig' %}
{% block body %}
这应该附加在底部
{% endblock %}
资源下文件夹和子目录中的所有文件。这可能吗?
可能有无数种方法可以做到这一点。以不包含空格等的文件名为准,则可以使用:
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
会破坏链接或符号链接。
你可以这样做sed
:
sed -i -e "
1s/^/\n{% extends '::layout.html.twig' %}\n{% block body %}\n/ ;
$s/$/\n{% endblock %}/
" $(ls -R resources/folder* )
将目录更改为resources
,创建两个模板文件:BEGIN
和END
.
{% extends '::layout.html.twig' %}
{% block body %}
{% endblock %}
sed -i '1s/^/\n/' */*
sed -i -e '1rBEGIN' -e '$rEND' */*
sed -i '1d' */*
没有反斜杠转义了,这个解决方案非常清晰和简单,并且可以很好地扩展。
最简单的方法是分两个步骤imo:
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'