私はプロジェクトのためにかなり大きなスクリプトを書いていますが、スクリプトを終了する前に経験している問題の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を変数の内容に置き換えたいので、マスクをオフにして= '
変数を挿入した後、再度マスクをオンにして「#」でコマンドを完成しました。