複数行のファイルコンテンツで文字列を置換する

複数行のファイルコンテンツで文字列を置換する

SALTファイル内の文字列を別のファイルの内容に置き換える必要があります。問題は、入力ファイルに複数行が含まれていることです。私は bash スクリプトで次のようなことを試しました:

SALT=`cat salt.txt`;
sed "s/SALT/$SALT/" wp-config.php > result.txt

問題なく動作します塩.txtは 1 行ですが、行が複数ある場合は失敗します。PERL で実行できると読みました。しかし、方法がわかりません。助けていただけませんか?

答え1

別のperl方法:

perl -pe 's/SALT/`cat salt.txt`/e' wp-config.php > result.txt

ここで重要なのは、コマンドの結果を置換文字列として/e使用できるようにする regexp オプションです。perl

答え2

に固執したい場合はbash、文字列にもファイルにも現れない文字、たとえば ; を選択します@

SALT=`< salt.txt tr '\n' '@'`
sed "s/SALT/$SALT/" wp-config.php | tr '@' '\n' > result.txt

この方法では、置換前にnewline文字列内の文字が に変更され@、置換後に文字@が に戻されるためnewlinesSALT配列として扱われるのではなく、長い文字列を含む変数として扱われます。

答え3

あなたはこれを行うことができます:

sed -e "/SALT/{r salt.txt" -e "d}" wp-config.php  > result.txt

salt.txtソルト、wp-config.phpは入力ファイル、SALTは置換する文字列です

答え4

perl -e 'open my $S, "<", "salt.txt" or die $!;
         $salt = do { local $/ ; <$S> };
         s/SALT/$salt/, print while <>;
        ' wp-config.php > result.txt

最初の行は を開きますsalt.txt。2
行目は、その内容を $salt 変数に読み込みます。3 行
目は、コマンドライン引数をファイル名として受け取り、ファイルを 1 行ずつ読み込んで文字列を置き換えます。

関連情報