1

我有如下的文件夹结构

resources/folder1 , /folder2 , /folder3

现在我希望这个文本前面加上换行符:

{% extends '::layout.html.twig' %}
{% block body %}

这应该附加在底部

{% endblock %}

资源下文件夹和子目录中的所有文件。这可能吗?

4

4 回答 4

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会破坏链接或符号链接。

于 2012-07-23T06:37:00.137 回答
2

你可以这样做sed

 sed -i -e "
 1s/^/\n{% extends '::layout.html.twig' %}\n{% block body %}\n/ ;
 $s/$/\n{% endblock %}/
 " $(ls -R resources/folder* )
于 2012-07-23T06:51:53.327 回答
2

将目录更改为resources,创建两个模板文件:BEGINEND.

文件:开始

{% extends '::layout.html.twig' %}
{% block body %}

文件:完

{% endblock %}

运行命令:

sed -i '1s/^/\n/' */*
sed -i -e '1rBEGIN' -e '$rEND' */*
sed -i '1d' */*

没有反斜杠转义了,这个解决方案非常清晰和简单,并且可以很好地扩展。

于 2012-07-23T06:56:36.423 回答
0

最简单的方法是分两个步骤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'
于 2012-07-23T07:06:24.980 回答