sed は、別の Unix パスを含む変数で Unix パスを置き換えます

sed は、別の Unix パスを含む変数で Unix パスを置き換えます

bash スクリプトで、sed 経由で Unix パスを別の Unix パスを含む変数に置き換える必要があります

例:

another_unix_path=/another/unix/path
sed -i 's/ \/some\/path\/file.txt/ '$another_unix_path'/g' some_file.txt

答え1

特殊文字をエスケープする必要があります:

another_unix_path="\/another\/unix\/path"
echo /some/path/file.txt | sed -e 's/\/some\/path\/file.txt/'$another_unix_path'/g'

出力結果は次のようになります:

/別の/unix/パス

答え2

特殊文字をエスケープすること/はオプションです。

たとえば、次の例を使用して、デフォルトのsed区切り文字 ( ) を変更することもできます。/?

another_unix_path="/another/unix/path"
echo /some/path/file.txt | sed -e 's?/some/path/file.txt?'$another_unix_path'?g'

フラグの直後に使用される文字によって、s使用される区切り文字が定義されます。s?

編集 :

#!/bin/sh
basepath=/another/unix/path
baseurl=/base/url
sed -i 's?# set $IMAGE_ROOT /var/www/magento2;? set $IMAGE_ROOT '$basepath$baseurl';?g' somefile.txt

答え3

セパレータとして使用する場合は、パス内の/すべての文字をエスケープする必要があります。例:/sed 's/\/some\/path/'$replacement'/g'

幸いなことに、sed では Perl と同様に、多くの文字を区切り文字として使用できるため、次のように記述することもできますsed 's#/some/path#'$replacement'#g'(gフラグは、行ごとに複数の出現箇所を置き換えるために使用します)。

また、sed をファイルに対して実行する場合、インプレース置換は許可されません。つまり、一時ファイルに書き込んで移動する必要があります。 アップデート:実際には、GnuのsedするPerl のように動作するインプレース オプションがあります。-iまたは、バックアップ拡張機能は-i.extどこにありますか。ただし、移植性を考えると Perl の方が適している場合があります。.ext

インプレース置換には、次のように Perl を使用できます。

# In-place without backup:
perl -pi -e 's#/some/path#'$replacement'#g' <file>

# In-place with backup as .orig (note .orig is glued to the -i switch):
perl -pi.orig -e 's#/some/path#'$replacement'#g' <file>

2 番目のコマンドを 2 回入力すると、最初のバックアップが上書きされるため注意してください。

関連情報