sedを使用して行を多くの特殊文字に置き換えますか?

sedを使用して行を多くの特殊文字に置き換えますか?

私はプロジェクトのためにかなり大きなスクリプトを書いていますが、スクリプトを終了する前に経験している問題の1つはsedコマンドを使用することです。

(cache.phpの)行を見つけようとしています:

$cache_directory = './cache'; 

'./cache'情報を名前付き変数に置き換えます$new_cache_directory

私が持っている問題の1つは、./cacheそれが何度も存在することです。私はこの行を変更したいだけですが、行番号を「ハードコーディング」して「未来保証」をしたくありません。

どうすればいいですか?

答え1

この試み:

sed -i.bak "s:^.*\(\$cache_directory = \)\('./cache'\):\1$new_cache_directory:" infile

答え2

したがって、「キャッシュ」を名前ではなく対応する変数の内容に変更したいようです。

sed 's#^$cache_directory = ../cache.;#$cache_directory = '$new_cache_directory'#' script.php

したがって、解決する必要がある他の問題があります。通常、sedコマンドは 's/foo/bar/'部分を区切るためにスラッシュを使用します。パスを扱うとき、これは不安ですが、使用できる区切り文字がたくさんあります。 「s」の後に暗黙的に宣言されます。

質問2も似ています。私たちはしばしば一重引用符を使ってコマンドを指定します。

sed 'command' file 

しかし、ここでは./cacheの周りにアポストロフィがあります。どうすればいいですか? 1つのアイデアは次のとおりです。

sed "command" file 

代わりに、これは通常は機能しますが、ここでは機能しません。アポストロフィはドル記号が解釈されるのを防ぎますが、引用符は解釈されるのを防ぎません。通常、アポストロフィは必要なく、次のように書くことができます。

sed s/standart/standard/g sample.txt 

ただし、$ cache_directoryをコマンドの変数として再度指定すると解釈されます。だから私はアポストロフィをピエロポイントに変え、他の表現がその部分と一致すればとても驚き../cache.ますxy/cachei

ところで、$new_cache_directoryを変数の内容に置き換えたいので、マスクをオフにして= '変数を挿入した後、再度マスクをオンにして「#」でコマンドを完成しました。

関連情報