それで、ディレクトリにたくさんのファイルがあり、それぞれにテキストの行を挿入する必要があります。それらは基本的に以下のフォーマットを持っています:
<VirtualHost *:80>
ServerAdmin gabe@localhost
DocumentRoot /var/www/test1
ServerName test1.local
ServerAlias test1
<Directory "/var/www/test1">
Options All
AllowOverride All
</Directory>
</VirtualHost>
そして、閉会の前に行を挿入したいと思います
</ VirtualHost>
このようなもの:
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
Perlを気にしない場合は、以下を試してください。
Perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile
-i
スイッチは、古いファイルを.old
拡張子を付けて現在のものに出力します。
必要な編集が多少複雑な場合でも、「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 /が機能します。
次の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'