web-dev-qa-db-ja.com

sedでパスを別のパスに置き換える方法は?

Cshスクリプトがあります(関連性があれば言語を変更できますが)。

sed s/AAA/BBB/ file

問題は、AAAとBBBがパスであるため、「/」が含まれていることです。 AAAは修正されているため、次のように言えます。

sed s/\\\/A\\\/A\\\A/BBB/ file

ただし、BBBは$ PWDなどの変数に基づいています。 $ PWDで「/」をエスケープするにはどうすればよいですか?

または、これを完全に行う他の方法はありますか?

36
Brian Postow

sedは、sコマンドで/の代わりに任意のセパレーターを使用できます。パスで遭遇しないものを使用してください:

s+AAA+BBB+

等々。

あるいは(推測したくない場合)、スラッシュをエスケープするためにsedでパスを前処理できます:

pwdesc=$(echo $PWD | sed 's_/_\\/_g')

$pwdescで必要なことを行います。

75
Lev Levitsky

置換文字列またはパターン文字列にスラッシュが含まれる状況では、GNU sedが代替コマンドの代替区切り文字を許可するという事実を利用できます。区切り文字の一般的な選択肢はパイプ文字です。またはハッシュ#-区切り文字の最適な選択は、多くの場合、処理中のファイルのタイプに依存します。

sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file

注:最後の#の後のgは、最初のouccurenceを変更する場合にファイル内のすべてのオカレンスを変更することです。gは使用しないでください。

20
c0m3t

深刻なスクリプティングにcshを使用するのは、通常 推奨しません です。ただし、それは当面の問題の正接です。

あなたはおそらく次のようなことをしているでしょう:

sed -e "s=$oldpath=$newpath="

ここで、シェル変数$oldpathには置換される値が含まれ、$newpathには置換が含まれ、どちらの変数にも等号が含まれないと想定されます。つまり、パターンの区切り文字を選択し、通常の/区切り文字は、パス名のスラッシュに関する問題を回避します。思ったら =がファイル名に表示される場合があります。control-Aやcontrol-Gなど、表示される可能性が低いものを選択してください。

5
sed -i "s|$fileWithPath|HAHA|g" file
4
pylover

パスから/ h /ネットワークパス参照を取得する必要がありました。それらを/ c /ドライブに向けると、存在しないディレクトリにマップされますが、すぐに解決します。 .bashrcで使用した

PATH=`echo $PATH | sed -e "s+/h/+/c/+g"`
1
D M Lowe

スラッシュをエスケープするには、括弧の展開${i/p/r}を使用できます。この場合、すべての出現をエスケープするための${i//p/r}

$p1=${p1//\//\\/}
$p2=${p2//\//\\/}
sed s/$p1/$p2/ file

または、より簡潔に、1行でsed s/${p1//\//\\/}/${p2//\//\\/}/ file

2つの最初のスラッシュ//は、すべてのオカレンスに一致することを示す括弧展開の区切り記号です。その後、\/は検索テンプレートのスラッシュをエスケープするため、/は2番目の区切り記号として展開してから\\/を置き換えます。魔女では、バックスラッシュをエスケープする必要があります。

0
FrViPofm