1

私は以下のようなフォルダ構造を持っています

resources/folder1 , /folder2 , /folder3

今、このテキストの先頭に改行を追加したい:

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

これは一番下に追加する必要があります

{% endblock %}

リソースの下のフォルダとサブディレクトリ内のすべてのファイル。これは可能ですか?

4

4 に答える 4

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

おそらく無数の方法があります。スペースなどを含まないファイル名を条件として、次を使用できます。

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スクリプトの実行中に人々があなたを妨害していると思われる場合は、または他のコマンドを使用する必要があるかもしれません。cpand done as shownはrm、ファイルのいずれかが実際にシンボリック リンク (またはハード リンク) である場合に問題が発生しないことを意味します。リンクは保持されます。mv tmp.$$ $fileリンクやシンボリックリンクを壊すような代替物。

于 2012-07-23T06:37:00.137 に答える
2

ディレクトリを に変更し、とresourcesの 2 つのテンプレート ファイルを作成します。BEGINEND

ファイル: BEGIN

{% 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

最も簡単な方法は、次の2つのステップです。

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 に答える