
したがって、ディレクトリに複数のファイルがあり、各ファイルにテキスト行を挿入する必要があります。デフォルトでは、次の形式があります。
<VirtualHost *:80>
ServerAdmin gabe@localhost
DocumentRoot /var/www/test1
ServerName test1.local
ServerAlias test1
<Directory "/var/www/test1">
Options All
AllowOverride All
</Directory>
</VirtualHost>
最後の前に行を挿入したいです。
</仮想ホスト>ブランド。私の最初の仮定は、sedを使用してタグを一致させ、交換できる必要があるということでした。これから試してみる予定ですが、誰かがこれを行うことができる既存の方法がある場合は、これについて聞きたいと思います。
答え1
このような:
sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'
働く複数のファイルに対してこのコマンドを繰り返すには、次のようにします。
for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done
@ChrisDown ありがとうございます。おそらくより良いでしょう(しかしテストされていません)。
find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\
done
答え2
Perlを使用しても問題ない場合は、以下を試してください。
perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile
この-i
スイッチは古いファイルを拡張子として保存.old
し、現在のファイルとして印刷します。
答え3
編集したいコンテンツがやや複雑な場合は、「ex」(コマンドラインvi)を使用することもできます。たとえば、 ""インスタンスを1つだけ挿入したいとします。
次のシェルスクリプトが機能します。
for FILENAME in *.whatever # Need a criteria to glob, or a list of names
do
ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done
このアプローチは、慎重に設計されたパターンで位置を見つけ、「カーソル移動」を実行する「ex」の利点を提供する。パターンを見つけたら、次のインスタンスを見つけて挿入を実行するなどの操作を実行できます。あるいは、テキストを挿入する代わりにテキストを変更することもできます。または範囲間で変更できます。 「ex」を使用すると、「.」が使用できることを忘れないでください。現在行なので、.,/^somepatter/s/blah/foo/ 動作します。
答え4
次の1行のコードを使用して、ファイル内の特定の場所(この場合は「VirtualHost」の前)に1行または複数行を挿入できます。コードは、デフォルトで指定されたディレクトリとそのサブディレクトリからファイル名を取得します(すべてのファイルにテキストを挿入したい場合は*。*です)。見つかったファイルの中から「VirtualHost」パターンを検索します。パターンが見つかったら、それを firstline\nsecondline\notherlines\n\VirtualHost に置き換えます。 「VirtualHost」は代替テキストの一部です。それ以外の場合、そのテキストは失われます。
find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'