文字列の検索と置換でスラッシュを使用してsedで検索して置換する

文字列の検索と置換でスラッシュを使用してsedで検索して置換する

withコマンドを/var/www使用してファイルを変更したい/home/lokesh/wwwsed

sed -i 's///var//www///home//lokesh//www/g' lks.php

しかし、これはエラーを提供します

sed: couldn't open file ww///home//lokesh//www/g: No such file or directory

答え1

知っているかどうかはわかりませんが、aを区切り文字としてsed使用する必要がない優れた機能があります。/

したがって、あなたの例は次のように書くことができます。

sed -i 's#/var/www#/home/lokesh/www#g' lks.php

#必ずしも1つである必要はなく、1文字でも構いません。たとえば、3区切り文字として使用する場合は、次のようになります。

echo "foo" | sed 's3foo3bar3g'
bar

答え2

他の人が指摘したように、次のように他の文字を区切り文字として使用できます。

sed -i 's!pattern!replacement!g' /path/to/file

/ただし、区切り文字を置き換える便利な文字がない場合は、pattern各文字の前にバックスラッシュを追加して合計に含まれる区切り文字をエスケープすることもできます。以下は、区切り文字を次に置き換えた例です。replacement\//some/path../some/replacement

sed -i 's/\/some\/path/..\/some\/replacement/g'

しかし、人間が読みにくくなるため、通常、次のように可能な場合は、異なる文字を区切り文字として使用することをお勧めします。

sed -i 's!/some/path!../some/replacement!g'

答え3

次のようなものを試しましたか?

sed -i 's@/var/www@/home/lokesh/www@g' lks.php

答え4

bashスクリプトでsedコマンドの前に単純なprematコマンドを入力すると、パス変数のスラッシュが隠されます。交換するパス変数が$ P0にあるとします。

P0="/foo/foo/foo/file"; 
P0=(${P0////\\/});  #masked Slash to form: \/foo\/foo\/foo\/file

次のように交換する必要があります。

P1="/whatever/youwant/file"; 
P1=(${P1////\\/}); #masked slash to form \/whatever\/youwant\/file

その後、単にsedを使用してください。

sed -i "s/${P0}/${P1}/" /wherever/that/should/go/file;

これはbash --version 5.1.4(1)で動作します。

関連情報