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


10

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


<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を使用してこれを実行できるはずであり、おそらくそのタグを一致させて置き換えることです。私はこれを試み始めるつもりですが、誰かがこれを行うための既存の方法を持っているなら、私はそれを聞いてみたいです。


これはもっとプログラミングタスクだと思うので正直になります。したがって、SOにする必要があります。私はそれを行うためにPerlを使用します。特に、解析し、Apache構成を変更するように設計されたPerlモジュールがあるに違いないからです。
xenoterracide 2010

2
ありがとう、しかしそれは単純なUNIXツールで簡単に達成できるはずのタスクなので、ここで尋ねました。でもコメントありがとうございます。
ゲイブ。

回答:


10

このようなもの:

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

すごい...これは私が探していたものです。
ゲイブ。

1
lsを解析しません。代わりにグロブを使用してください。mywiki.wooledge.org/ParsingLs
Chris Down

あなたは@ChrisDownの正義です。私の答えを改善してください。
lcipriani

異なる文字選択/スラッシュをエスケープする必要はありませんので、クリーナーは、SEDの発現のためにされています's:</VirtualHost>:yourlinehere\n</VirtualHost>:'
アレクサンダー

2

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

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

-iスイッチはと古いファイルを保存します.old現在のものに拡張して印刷。


2

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


0

次の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'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.