私は以下のようなフォルダ構造を持っています
resources/folder1 , /folder2 , /folder3
今、このテキストの先頭に改行を追加したい:
{% extends '::layout.html.twig' %}
{% block body %}
これは一番下に追加する必要があります
{% endblock %}
リソースの下のフォルダとサブディレクトリ内のすべてのファイル。これは可能ですか?
あなたはそれを作ることができますsed
:
sed -i -e "
1s/^/\n{% extends '::layout.html.twig' %}\n{% block body %}\n/ ;
$s/$/\n{% endblock %}/
" $(ls -R resources/folder* )
おそらく無数の方法があります。スペースなどを含まないファイル名を条件として、次を使用できます。
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
and done as shownはrm
、ファイルのいずれかが実際にシンボリック リンク (またはハード リンク) である場合に問題が発生しないことを意味します。リンクは保持されます。mv tmp.$$ $file
リンクやシンボリックリンクを壊すような代替物。
ディレクトリを に変更し、とresources
の 2 つのテンプレート ファイルを作成します。BEGIN
END
{% extends '::layout.html.twig' %}
{% block body %}
{% endblock %}
sed -i '1s/^/\n/' */*
sed -i -e '1rBEGIN' -e '$rEND' */*
sed -i '1d' */*
バックスラッシュをエスケープする必要はありません。このソリューションは非常に明確でシンプルで、スケーリングにも適しています。
最も簡単な方法は、次の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'