Cshスクリプトがあります(関連性があれば言語を変更できますが)。
sed s/AAA/BBB/ file
問題は、AAAとBBBがパスであるため、「/」が含まれていることです。 AAAは修正されているため、次のように言えます。
sed s/\\\/A\\\/A\\\A/BBB/ file
ただし、BBBは$ PWDなどの変数に基づいています。 $ PWDで「/」をエスケープするにはどうすればよいですか?
または、これを完全に行う他の方法はありますか?
sed
は、s
コマンドで/
の代わりに任意のセパレーターを使用できます。パスで遭遇しないものを使用してください:
s+AAA+BBB+
等々。
あるいは(推測したくない場合)、スラッシュをエスケープするためにsedでパスを前処理できます:
pwdesc=$(echo $PWD | sed 's_/_\\/_g')
$pwdesc
で必要なことを行います。
置換文字列またはパターン文字列にスラッシュが含まれる状況では、GNU sedが代替コマンドの代替区切り文字を許可するという事実を利用できます。区切り文字の一般的な選択肢はパイプ文字です。またはハッシュ#-区切り文字の最適な選択は、多くの場合、処理中のファイルのタイプに依存します。
sed -i 's#/path/to/AAA#/path/to/BBB#g' your_file
注:最後の#の後のgは、最初のouccurenceを変更する場合にファイル内のすべてのオカレンスを変更することです。gは使用しないでください。
深刻なスクリプティングにcsh
を使用するのは、通常 推奨しません です。ただし、それは当面の問題の正接です。
あなたはおそらく次のようなことをしているでしょう:
sed -e "s=$oldpath=$newpath="
ここで、シェル変数$oldpath
には置換される値が含まれ、$newpath
には置換が含まれ、どちらの変数にも等号が含まれないと想定されます。つまり、パターンの区切り文字を選択し、通常の/
区切り文字は、パス名のスラッシュに関する問題を回避します。思ったら =
がファイル名に表示される場合があります。control-Aやcontrol-Gなど、表示される可能性が低いものを選択してください。
sed -i "s|$fileWithPath|HAHA|g" file
パスから/ h /ネットワークパス参照を取得する必要がありました。それらを/ c /ドライブに向けると、存在しないディレクトリにマップされますが、すぐに解決します。 .bashrcで使用した
PATH=`echo $PATH | sed -e "s+/h/+/c/+g"`
スラッシュをエスケープするには、括弧の展開${i/p/r}
を使用できます。この場合、すべての出現をエスケープするための${i//p/r}
。
$p1=${p1//\//\\/}
$p2=${p2//\//\\/}
sed s/$p1/$p2/ file
または、より簡潔に、1行でsed s/${p1//\//\\/}/${p2//\//\\/}/ file
2つの最初のスラッシュ//
は、すべてのオカレンスに一致することを示す括弧展開の区切り記号です。その後、\/
は検索テンプレートのスラッシュをエスケープするため、/
は2番目の区切り記号として展開してから\\/
を置き換えます。魔女では、バックスラッシュをエスケープする必要があります。