web-dev-qa-db-ja.com

複数のファイルにテキスト行を追加する

それで、ディレクトリにたくさんのファイルがあり、それぞれにテキストの行を挿入する必要があります。それらは基本的に以下のフォーマットを持っています:


<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>
10
gabe.

このようなもの:

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
10
lcipriani

Perlを気にしない場合は、以下を試してください。

Perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

-iスイッチは、古いファイルを.old拡張子を付けて現在のものに出力します。

2
gvkv

必要な編集が多少複雑な場合でも、「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 /が機能します。

2
Bruce Ediger

次の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'
0
Oufie